昨天我遇到了一个奇怪的问题:当我想传递一个zip文件byte[]
并阅读它时,我得到了Ionic.Zip.ZipExpception
无法将其读作ZipFile
public string Import(byte[] file)
{
try
{
var stream = new MemoryStream(file);
if (ZipFile.IsZipFile(stream))
{
ImportArchive(stream);
} else {
...
}
...
}
private void ImportArchive(MemoryStream stream)
{
var zip = ZipFile.Read(stream); //--> ZipException thrown
...
}
现在,如果我将byte[]
作为参数传递而不是MemoryStream
,那么一切正常:
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!
...
}
这两个版本的区别在哪里?为什么不能读取传递的MemoryStream
的第一个版本?
答案 0 :(得分:1)
ZipFile.IsZipFile
更改了流的位置 - 它需要读取多个字节的数据。你需要"倒带"调用ImportArchive
之前的流:
stream.Position = 0;
这不是可以自动完成的事情 - 当您将某个方法传递给某个流时,通常会假定您指向相关数据的开头。这允许您拥有不同的数据"数据包"在一个流中,这意味着您可以使用不可搜索的流。