2

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

パスワードが設定されたマルチボリュームファイルで整合性チェックを無視すると、別の例外が発生するため、抽出できません...

おそらくソースコードのバグですが、ライブラリがマルチボリュームファイルの抽出をサポートしていないのは非常に奇妙であるため、確認してください...

4

1 に答える 1

4

おそらくソースコードのバグです

これは実際にそうです。

SevenZipExtractor.csソース コードを見ると、次の行が表示されます (メソッド ブロック内finallyあるため、常に実行されます)。

((InStreamWrapper)_archiveStream).Dispose();

ここで、は型( に注意)_archiveStreamのクラス フィールドであり、 から派生しないインターフェイス型であるため、メソッドはありません。 IInStreamIIDisposableDispose

InStreamWrapperさらに詳しく見ると、いずれかまたはInMultiStreamWrapperクラスのインスタンスで初期化されていることがわかります。どちらも共通の基本クラスを共有していますStreamWrapperが、後者は前者から継承しないため、キャスト例外が発生します。

ソースコードを変更する意思がある場合、修正は非常に簡単です。上記の行を次のように置き換えるだけです。

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

でも

パスワードが設定されたマルチボリュームファイルで整合性チェックを無視すると、別の例外が発生するため、抽出できません...

Check内部でメソッドを呼び出すことはなくCheck、呼び出す前に呼び出すかどうかの関係はありませんExtractArchive。したがって、上記のバグを修正することで、あなたが話している別の例外を防ぐことができるとは思えません。

于 2016-03-24T15:43:18.090 に答える