读取包含多个文件的MemoryStream

时间:2011-10-07 19:17:00

标签: c# memorystream

如果我有一个MemoryStream,我知道我已经向这个MemoryStream发送了多个文件(例子5文件)。是否可以从此MemoryStream读取并能够逐个文件拆分?

我的直觉告诉我不,因为当我们阅读时,我们正在逐字节阅读......任何帮助和可能的片段都会很棒。我无法在谷歌或这里找到任何东西:(

5 个答案:

答案 0 :(得分:3)

你不能直接,不是你不以某种方式划分文件,或者知道每个文件放入缓冲区的精确大小。

可以使用压缩文件(如zip文件)代替传输多个文件。

答案 1 :(得分:1)

流只是一行字节。如果将文件彼此相邻放在流中,则需要知道如何将它们分开。这意味着你必须知道文件的长度,或者你应该使用一些分隔符。一些(大多数)文件类型有一种标题,但在整个流中查找它也可能不防水,因为文件的标题也可能是另一个文件中的数据。

因此,如果您需要将文件写入此类流,则添加一些额外信息是明智之举。例如,从版本号开始,然后写入第一个文件的大小,写入文件本身,然后写下一个文件的大小等等。

从版本号开始,您可以更改此格式。将来您可能还决定需要存储文件名。在这种情况下,您可以增加版本号,组成新格式,并且仍然可以读取先前创建的流。

如果您也存储这些流,这当然特别有用。

答案 2 :(得分:0)

你需要自己实现这个,你想要做的是在流中写入某种“分隔”。当你正在阅读时,寻找那个分隔的,你会知道什么时候你找到了一个新文件。

这是一个快速而肮脏的例子:

 byte[] delimiter = System.Encoding.Default.GetBytes("++MyDelimited++");

 ms.Write(myFirstFile);
 ms.Write(delimiter);
 ms.Write(mySecondFile);

 ....

 int len;
 do {
    len = ms.ReadByte(buffer, lastOffest, delimiter.Length);
    if(buffer == delimiter)
    {
       // Close and open a new file stream
    }
    // Write buffer to output stream
 } while(len > 0);

答案 3 :(得分:0)

由于您要发送它们,因此您必须将它们发送到流中,以便您知道如何将它们拉出来。最常见的方法是使用长度规范。例如,要将文件写入流:

  • 将整数写入流以指示文件数

然后为每个文件

  • 写一个整数(如果文件很大,则为long)以指示文件中的字节数
  • 写文件

要回读文件,

  • 读取整数(n)以确定流中的文件数

然后,迭代n次,

  • 读取一个整数(或long,如果这是你选择的那个)来确定文件中的字节数
  • 阅读文件

答案 4 :(得分:0)

您可以改用IEnumerable<Stream>