读取包含多个文件的MemoryStream

本文关键字:MemoryStream 文件 包含多 读取 | 更新日期: 2023-09-27 18:10:53

如果我有一个单一的MemoryStream,我知道我发送了多个文件(示例5文件)到这个MemoryStream。是否有可能从这个MemoryStream中读取,并能够逐个文件分开?

我的直觉告诉我没有,因为当我们读的时候,我们是一个字节一个字节地读…任何帮助和可能的片段将是伟大的。我没能在谷歌或这里找到任何东西:(

读取包含多个文件的MemoryStream

如果不以某种方式分隔文件,或者在每个文件放入缓冲区时不知道的确切大小,则不能直接使用

可以使用压缩文件,例如zip文件来传输多个文件。

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

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

以版本号开头,您可以对该格式进行更改。将来,您可能会决定也需要存储文件名。在这种情况下,您可以增加版本号,创建新的格式,并且仍然能够读取先前创建的流。

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

既然要发送它们,就必须以一种知道如何提取它们的方式将它们发送到流中。最常用的方法是使用长度规范。例如,要将文件写入流:

  • 向流写入一个整数,表示文件的数量

对于每个文件,

  • 写入一个整数(如果文件较大,则为long)来表示文件
  • 中的字节数。写入文件

要读回文件,

  • 读取一个整数(n)来确定流
  • 中的文件数。

然后,迭代n次,

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

您可以使用IEnumerable<Stream>代替。

你需要自己实现这个,你想要做的是在流中写一些'分隔'。当您阅读时,查找分隔符,您就会知道您什么时候进入了一个新文件。

下面是一个简单的例子:

 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);