如果我有一个MemoryStream,我知道我已经向这个MemoryStream发送了多个文件(例子5文件)。是否可以从此MemoryStream读取并能够逐个文件拆分?
我的直觉告诉我不,因为当我们阅读时,我们正在逐字节阅读......任何帮助和可能的片段都会很棒。我无法在谷歌或这里找到任何东西:(
答案 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>
。