读取包含多个文件的MemoryStream
本文关键字:MemoryStream 文件 包含多 读取 | 更新日期: 2023-09-27 18:10:53
如果我有一个单一的MemoryStream,我知道我发送了多个文件(示例5文件)到这个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);