2016-10-29 3 views
1

Согласно ответу here я хочу написать несколько файлов поток в один поток следующим образом:несколько файлов в одном потоке, пользовательский поток

4 байта зарезервированы для длины числа каждого потока каждого поток контент записи после его длины номер (после 4 байта) в конце потока будет нечто вроде этого

поток = File1 len + File1 stream content + File2 len + File2 stream content + ....

Пример кода:

result = new ExportResult_C() 
      { 
       PackedStudy = packed.ToArray() , 
       Stream = new MemoryStream() 
      }; 
      string[] zipFiles = Directory.GetFiles(zipRoot); 
      foreach (string fileN in zipFiles) 
      { 
       MemoryStream outFile = new MemoryStream(File.ReadAllBytes(fileN)); 
       MemoryStream len = new MemoryStream(4); 
       //initiate outFile len to 4 byte push it to main stream 
       //Then push outFile stream to main stream 
       //Continue and do this for another file 
      } 
      //For test Save stream to file(s) 

Это хорошая идея? действительно не знаю, как эти комментарии могут быть строками кода.

Заранее спасибо.

+0

Ничего плохого в упаковке данных в один поток. Если пар содержит несколько типов, вам также может понадобиться добавить один байтовый тип сообщения после/перед байтом. – jdweng

+0

Спасибо за ваш комментарий, не все файлы имеют один тип (zip), но как? – Aria

ответ

1

Попробуйте

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.IO; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      byte[] testMessage = Encoding.UTF8.GetBytes("The quick brown fox jumped over the lazy dog"); 
      MemoryStream outFile = new MemoryStream(); 
      BinaryWriter writer = new BinaryWriter(outFile); 
      for (int i = 0; i < 10; i++) 
      { 
       writer.Write(BitConverter.GetBytes(testMessage.Length), 0, 4); 
       writer.Write(testMessage, 0, testMessage.Length); 
      } 
      writer.Flush(); 

      outFile.Position = 0; 
      BinaryReader reader = new BinaryReader(outFile, Encoding.UTF8); 
      while (outFile.Position < outFile.Length) 
      { 
       int size = reader.ReadInt32(); 
       byte[] data = reader.ReadBytes(size); 
      } 
     } 
    } 
} 
+0

Должно быть, писатель не читатель. Сожалею. Исправлен код. – jdweng

+0

Ничего другого, это было просто имя переменной, поэтому 'outFile' будет потоком всех файлов? – Aria

+0

Как его следует читать в потребительской стороне, следует ли использовать «BinaryReader»? – Aria

0

Я думаю, что есть лучшее решение, которое я отправил в ответ на мой вопрос here множественных байты файла будут сериализовать в один поток, и в стороне клиента будет десериализация к классу байтовый массив.

см. here, может быть пригодится.

Но я принял решение @jdweng, и я ценю его внимание и помощь.

Смежные вопросы