2016-03-20 21 views
2

SevenZipSharpライブラリを使用して、マルチボリューム7zファイルを生成しました。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 

をパスワードが設定されている場合、別の例外が発生するため、私はそれを抽出できません...

Probabllyはソースコードのバグですが、ライブラリがマルチボリュームの抽出をサポートしていないというのは非常に奇妙ですファイル...

答えて

4

Probabllyはソースコードのバグです

これは実際のケースです。

(それは常に実行して、方法finallyブロック内)SevenZipExtractor.csソースコードを見ると、私たちは次の行を参照してください。_archiveStreamはタイプIInStreamのクラスフィールドで

((InStreamWrapper)_archiveStream).Dispose(); 

Iの点に注意してください。 )はIDisposableから派生しないため、Disposeメソッドはありません。

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

ソースコードを修正したい場合は、それを修正するのは簡単です。ただで上記の行を置き換えます:私はパスワードが設定されているマルチボリュームファイルとの整合性チェックを、無視する場合は、別の例外が発生するため

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

しかし

、その後、私はそれを抽出することはできません。.. 。

彼らは内部Checkメソッドを呼び出すことはありませんし、あなたがExtractArchiveを呼び出す前にCheckを呼び出すかどうかのいずれかの関係があってはなりません。だから私は上記のバグを修正することであなたが話しているもう一つの例外を防ぐことはできないだろう。

関連する問題