gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 20:37:26 35 4
gpt4 key购买 nike

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

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

Unable to cast object

of type 'SevenZip.InMultiStreamWrapper' to type '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

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

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

最佳答案

Probablly is a bug in their source-code

确实如此。

查看 SevenZipExtractor.cs在源代码中,我们看到以下行(在方法 finally block 内,因此它始终执行):

((InStreamWrapper)_archiveStream).Dispose();

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

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

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

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

不过

If I ignore the integrity check, with a multi volume file that has a password set, then I cannot extract it because another exception occurs...

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

关于c# - 如何使用 SevenZipSharp 提取多卷 7z 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36116002/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com