2016-04-09 16 views
0

私はSharpCompressライブラリを使用しています(これは問題ではありません)。私のzipは保護されていないか、パスワードで保護されています(すべて同じパスワード)。私はこのようにそれをコーディングしています:ファイルの読み込み時のファイルストリームの例外(ブロックの使用方法)

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 
} 

それは常にあいまいな「は無効なヘッダー:XXXXXXXX」上げる、それは私がストリームが開始時ではないと思うので、MoveToNextEntryを呼び出すためにcatchブロックになったときに例外を。

私は使用ブロックを使用しているため、例外内に 'File.OpenRead(file)'を置くことはできません。私が(コメントで示唆されているように)シークを使用すると、オブジェクト参照が設定されていない(おそらくdisposeが呼ばれている)。

このファイルストリームをリセットし、(まだブロックを使用している間も)ファイルストリームが確実に破棄されるようにする方法はありますか?もう一度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(); 
} 
+0

私が設定されていないオブジェクト参照の例外を取得します。おそらく処分はそれから呼ばれたでしょうか? –

+1

SharpCompress 0.11.5で試したところ、うまくいきました。私が試した完全なコードで答えを更新しています。また、パスワード保護の例外を処理するためにcatchステートメントを編集しました。 C#6.0でなければ、whenディレクティブを省略することができます。 –

+0

ありがとう:)私は後でオープンを逃したと思います。 –

関連する問題