2017-03-15 2 views
0

Ich versuche eine Zip-Datei zu entpacken, die auf 5 Teile aufgeteilt ist. Problem ist jeder Teil ist in einer anderen CD und ich muss in der Lage sein, Festplatten beim Entpacken zu ändern. Ich habe Ionic.Zip verwendet, um das ohne Glück zu tun!Zip-Datei entpacken C# (Teile von CD laden)

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); 
      } 
     } 
    } 

Ich habe versucht SevenZip, ZipSharp, aber ich kann es nicht implementieren! Gibt es eine Möglichkeit, mit dieser Situation umzugehen?

+0

Wie wird die Spaltung umgesetzt? Wenn es nur gespalten ist und keine spezielle Magie passiert, können Sie nicht einfach alle Dateien in ein Byte-Array laden und über ZipArchive laden? –

+0

Dateien sind groß. und das wird ein anderes Problem sein –

+0

Sind Sie sicher, dass es eine geteilte und keine übergreifende Zip-Datei ist? –

Antwort

2

Um ein gespaltet ZipArchive keine zusätzliche Bibliothek geöffnet ist notwendig, aber einige zusätzliche Arbeit muss

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 
} 

In diesem Beispiel i CombinationStream alle ZipFiles öffnen verwenden getan werden, aber Sie können Ihre eigene Klasse inheriting leicht schreiben Stream für Ihre Bedürfnisse, der darauf wartet, dass alle CDs gelesen werden.

könnte ein Ausgangspunkt (nur Pseudo-Code) sein:

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; 
    } 
}