读取 zip 文件时的文件流异常(如何使用块)

Posted

技术标签:

【中文标题】读取 zip 文件时的文件流异常(如何使用块)【英文标题】:file stream exception on reading zip file (how to use using block) 【发布时间】:2016-04-09 20:36:55 【问题描述】:

我正在使用 SharpCompress 库(这不是问题)。我的拉链要么未受保护,要么受密码保护(都使用相同的密码)。所以我是这样编码的:

using(Stream stream = File.OpenRead(file))

    try 
        reader = ZipReader.Open(stream);
        moreFiles = reader.MoveToNextEntry();
     catch (Exception e) 
        reader = ZipReader.Open(stream, pwd);
        moreFiles = reader.MoveToNextEntry();
    
    //rest of code

每当它到达 catch 块调用 MoveToNextEntry 时,它总是会引发一个模糊的“无效标头:xxxxxxxx”异常,因为我认为流不在开始处。

我不能将File.OpenRead(file) 放入异常中,因为我正在使用using 块。如果我使用(如 cmets 中所建议的)搜索,我会得到一个未设置的对象引用(可能已调用 dispose)。

有没有办法重置这个文件流并仍然确保它被释放(同时仍然使用using 块)。我不知道再次调用 open 是否会导致 using 块也有点不高兴。

谢谢。

【问题讨论】:

【参考方案1】:

您是否尝试过以下方法:

try

    reader = ZipReader.Open(stream);
    moreFiles = reader.MoveToNextEntry();

catch (CryptographicException e) when (e.Message == "No password supplied for encrypted zip.")

    stream.Seek(0, SeekOrigin.Begin);
    reader = ZipReader.Open(stream, pwd);
    moreFiles = reader.MoveToNextEntry();

【讨论】:

我得到一个未设置对象引用的异常。大概那个 dispose 已经被调用了? 我刚刚使用 SharpCompress 0.11.5 进行了尝试,并且成功了。我正在使用我尝试过的完整代码更新答案。我还编辑了 catch 语句来处理密码保护异常。如果您不在 C# 6.0 中,则可以省略 when 指令。 谢谢 :) 我想我后来错过了公开赛。

以上是关于读取 zip 文件时的文件流异常(如何使用块)的主要内容,如果未能解决你的问题,请参考以下文章

C语言中fread函数,当文件流缓冲中剩余长度小于需要读取的长度时的问题

如何修复流关闭异常

求解 java 对压缩文件zip 加密 !

使用通用流通过 SharpCompress 创建压缩文件

C/C++中如何将文件读取为二进制数据到数组中,再从数组中读取二进制流还原为文件,主要是后一步

从文件模式为读取的文件流创建存档 .zip