2017-03-15 10 views
0

5つの部分に分割されたzipファイルを解凍しようとしています。問題は各部品が別のCDに入っているため、解凍中にディスクを交換できる必要があります。 私はIonic.Zipを使用して運がないことをしました!分割されたzipファイルの解凍(CDからの読み込み部分)

foreach (var entry in zip.Entries) 
    { 
     var stream = entry.OpenReader(); 
     var buffer = new byte[readByte]; 
     int n; 
     try 
     { 
      while ((n = stream.Read(buffer, 0, buffer.Length)) > 0) 
      { 
       fileStream.Write(buffer, 0, buffer.Length); 
      } 
     } 
     catch (FileNotFoundException ex) 
     { 
      // stream is closed and you cant continue   
      MessageBox.Show("Change CD"); 

      while ((n = stream.Read(buffer,0, buffer.Length)) > 0) 
      { 
       fileStream.Write(buffer, 0, buffer.Length); 
      } 
     } 
    } 

私はSevenZip、ZipSharpを試しましたが、私はそれを実装できません! このような状況に対処する方法はありますか?

+0

はどのように分割が実装されていますか?それがちょうど分割され、特別な魔法がなければ、すべてのファイルを1バイトの配列にロードしてZipArchive経由で読み込むことはできませんか? –

+0

ファイルが大きいです。それは別の問題になります –

+0

分割されたもので、スパンドしたzipファイルではありませんか? –

答えて

2

は分割さZIPARCHIVE余分なライブラリが必要とされている開くには、いくつかの余分な仕事は、私はすべてのzipファイルを開くためにCombinationStreamを使用して、この例では

List<string> files = new List<string> { "zip.001", 
             "zip.002", 
             "zip.003", 
             "zip.004", 
             }; 
using (var zipFile = new ZipArchive(new CombinationStream(files.Select(x => new FileStream(x, FileMode.Open) as Stream).ToList()), ZipArchiveMode.Read)) 
{ 
    // Do whatever you want 
} 

行われる必要がありますが、簡単に自分のクラスの継承を書くことができますすべてのCDが読み込まれるのを待つ、あなたのニーズに合わせたストリーム。

始点は(単なる擬似コード)のようになります。

public class MultiDeviceStream : Stream 
{ 
    [...] 
    private Queue<Stream> streams; 
    private Stream activeStream; 

    public byte ReadByte() { 
     byte result; 
     if (!activeStream.EndOfStream) { 
      result = activeStream.ReadByte(); 
      if (!streams.CanDequeue && activeStream.EndOfStream) { 
       // raise some event signaling to change the CD and wait for the new filestream here 
       this.EndOfStream = true; 
      } 
     } else { 
      if (streams.CanDequeue) { 
       activeStream = streams.Dequeue(); 
      } 
      else 
      { 
       throw EndOfStreamException(); 
      } 
      return ReadByte(); 
     } 
     return result; 
    } 
} 
関連する問題