Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 作为参数传递时,MemoryStream不可读_C#_Memorystream_Dotnetzip - Fatal编程技术网

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;