如何使用 SevenZipSharp 提取多卷 7z 文件?

Posted

技术标签:

【中文标题】如何使用 SevenZipSharp 提取多卷 7z 文件?【英文标题】:How to extract a multi volume 7z file using SevenZipSharp? 【发布时间】:2016-03-20 15:56:49 【问题描述】:

我使用 SevenZipSharp 库生成了一个多卷 7z 文件。

我遇到的问题是,当我尝试提取文件时,我得到一个关于无效转换的异常:

无法投射对象

类型为“SevenZip.InMultiStreamWrapper”的类型为“SevenZip.InStreamWrapper”。

抛出异常的方法是SevenZipExtractor.Check()

这是用 Vb.Net 编写的用于重现提取问题的示例代码,但我也可以接受 C# 解决方案:

Public Overridable Function Extract(ByVal sourceFilePath As String,
                                    ByVal outputDirectorypath As String,
                                    ByVal password As String) As String

    If String.IsNullOrEmpty(password) Then
        Me.extractor = New SevenZipExtractor(sourceFilePath)
    Else
        Me.extractor = New SevenZipExtractor(sourceFilePath, password)
    End If

    ' Check for password matches doing an integrity check.
    If Me.extractor.Check() Then
        ' Start the extraction.
        Me.extractor.ExtractArchive(outputDirectorypath)

    Else
        Throw New Exception(
              "Failed to extract, maybe the provided password does not match?.")

    End If

    Return outputDirectorypath

End Function

如果我忽略完整性检查,使用设置了密码的多卷文件,那么我无法提取它,因为发生另一个异常...

可能是他们的源代码中的一个错误,但我要求确定,因为库不支持提取多卷文件很奇怪......

【问题讨论】:

【参考方案1】:

可能是他们的源代码中的一个错误

确实如此。

查看SevenZipExtractor.cs源代码,我们看到下面一行(在方法finally块内,所以它总是执行):

((InStreamWrapper)_archiveStream).Dispose();

其中_archiveStreamIInStream 类型的类字段(注意I),它不是从IDisposable 派生的接口类型,因此没有Dispose 方法。

再深入一点,我们可以看到它是用InStreamWrapperInMultiStreamWrapper 类的实例初始化的。虽然它们都共享公共基类StreamWrapper,但后者不继承前者,因此出现强制转换异常。

如果您愿意修改源代码,修复它非常容易。只需将上面的行替换为:

if (_archiveStream is IDisposable)
    ((IDisposable)_archiveStream).Dispose();

然而

如果我忽略完整性检查,使用设置了密码的多卷文件,那么我无法提取它,因为发生另一个异常...

它们不会在内部调用Check方法,并且在调用ExtractArchive之前是否调用Check应该没有任何关系。所以我怀疑修复上述错误会阻止你所说的另一个异常。

【讨论】:

以上是关于如何使用 SevenZipSharp 提取多卷 7z 文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何基本上用sevenzipsharp提取文件

SevenZipSharp 在提取时显示当前提取文件

SevenZipSharp ExtractARchive 决定了错误的格式

SevenZipSharp的入门教程(包含如何加密压缩,解密压缩)

为啥解压时 sfx Sevenzipsharp '7-zip : unsupported method'?

[原]使用SevenZipSharp出现“Can not load 7-zip library or internal COM error! Message: DLL file does