C# 作为参数传递时,MemoryStream不可读
昨天我遇到了一个奇怪的问题:当我想以C# 作为参数传递时,MemoryStream不可读,c#,memorystream,dotnetzip,C#,Memorystream,Dotnetzip,昨天我遇到了一个奇怪的问题:当我想以byte[]的形式传递一个zip文件并读取它时,我得到了一个Ionic.zip.zipexception 无法将其作为ZipFile读取 现在,如果我将字节[]作为参数传递,而不是内存流,则一切正常: public string Import(byte[] file) { try { if (ZipFile.IsZipFile(new MemoryStream(file), true))
byte[]
的形式传递一个zip文件并读取它时,我得到了一个Ionic.zip.zipexception
无法将其作为ZipFile读取
现在,如果我将字节[]
作为参数传递,而不是内存流
,则一切正常:
public string Import(byte[] file)
{
try
{
if (ZipFile.IsZipFile(new MemoryStream(file), true))
{
ImportArchive(file);
} else {
...
}
...
}
private void ImportArchive(byte[] file)
{
var fileStream = new MemoryStream(file);
var zip = ZipFile.Read(fileStream); //--> no exception!
...
}
这两个版本的区别在哪里?为什么传递的
内存流的第一个版本不能被读取?ZipFile.IsZipFile
更改流位置-它需要读取多个字节的数据。在调用ImportArchive之前,您需要“倒带”流:
stream.Position = 0;
这不是可以自动完成的—当您将某个方法传递给流时,通常假定您指向相关数据的开头。这允许您在一个流中有不同的数据“包”,这意味着您可以使用不可查找的流。在调用ImportArchive
之前,是否尝试将内存流位置设置为0?可能ZipFile。IsZipFile(流)
正在更改流位置。在读取之前,请尝试在您的ImportArchive(MemoryStream s)
方法中将其设置为0。
stream.Position = 0;