2017-03-26 2 views
0

Ich verwende die folgende Methode, um eine Gzip-Datei durch Komprimieren der Daten zu erstellen.Wie erstelle ich eine Gzip-Datei ohne Dekomprimierung?

 public static void GZipCompress(Stream dataToCompress, Stream outputStream) 
     { 

      GZipStream gzipStream = new GZipStream(outputStream, CompressionMode.Compress); 

      int readBufferSize = 10000; 

      byte[] data_ = new byte[readBufferSize]; 
      int bytesRead = dataToCompress.Read(data_, 0, readBufferSize); 
      while (bytesRead > 0) 
      { 
       gzipStream.Write(data_, 0, bytesRead); 
       data_ = new byte[readBufferSize]; 
       bytesRead = dataToCompress.Read(data_, 0, readBufferSize); 
      } 

      try 
      { 
       gzipStream.Flush(); 
       gzipStream.Close(); 
      } 
      catch (ObjectDisposedException ioException) 
      { 

      } 

     } 

Aber wenn es schon in einem Zip-Format ist, sollte ich es nicht komprimieren. Sie müssen nur die Daten an die Ausgabe-GZip-Datei anhängen, ohne zu komprimieren. Ich verwende die folgende Methode dafür.

public static void CopyStream(Stream input, Stream output) 
    { 
     byte[] buffer = new byte[16 * 1024]; // Fairly arbitrary size 
     int bytesRead; 

     while ((bytesRead = input.Read(buffer, 0, buffer.Length)) > 0) 
     { 
      output.Write(buffer, 0, bytesRead); 
     } 

     output.Flush(); 
     output.Close(); 
    } 

Wenn die Erweiterung der Datei enthält keine „zip“ Ich bin die GZipCompress Methode aufrufen. Wenn die Erweiterung der Datei "zip" ist, rufe ich die CopyStream-Methode auf. Aber nach dem Kopieren des Inhalts in den Ausgabestream über CopyStream in eine GZip-Datei, wenn ich versuche, diese Datei zu dekomprimieren, bekomme ich die folgende Ausnahme.

An unhandled exception of type 'System.IO.InvalidDataException' occurred in System.dll 
The magic number in GZip header is not correct. Make sure you are passing in a GZip stream. 

Ist es möglich, unkomprimierte Daten in eine GZip-Datei zu schreiben? Wenn ja, was mache ich hier falsch? Wenn nicht, gibt es andere Möglichkeiten, dies zu erreichen? jede Hilfe würde sehr geschätzt werden.

+0

Möglicherweise verwenden Sie die Write-Methode für Stream-Klassen. Stellen Sie sicher, dass Sie in Ihrer CopyStream-Methode zwei GZipStreams übergeben oder noch besser Ihre Parametertypen in GZipStream ändern und dies erzwingen. – dannyhut

+0

Auch wenn ich GZipStreams übergebe, kann ich die Schreibmethode von GzipStream immer noch nicht aufrufen. Weil das Daten richtig komprimiert? Ich will nicht bereits komprimierte Daten wieder komprimiert werden :( – mayooran

+0

Nicht von der Dokumentation. Schreibt mit GZipStreams write Methode schreibt Daten, die bereits komprimiert ist. Nicht sicher, ob das ist, was Sie brauchen. – dannyhut

Antwort

1

GZipStream und ZIP Dateiformat sind verschiedene Dinge - so können Sie nicht ZIP als Inhalt von GZipStream verwenden.

ZIP ist ein Container für mehrere potenziell komprimierte Dateien, während GZipStream komprimierter Inhalt einer einzelnen Datei ohne zusätzliche Header ist. Wenn Sie also versuchen, den Inhalt von ZIP mit GZipStream zu lesen, wird der ZIP-Header des Containers statt der erwarteten GZip-Signatur gefunden - und kann daher nicht analysiert werden.

Wenn Sie mehrere Dateien zu einem einzigen Paket zusammenfassen möchten, verwenden Sie das ZIP-Format - siehe Create normal zip file programmatically. Wenn Sie von 3.5 auf eine neuere .Net-Version wechseln können, können Sie anstelle von externen Bibliotheken integrierte Klassen ZipFile und zugehörige Klassen verwenden. Es unterstützt auch das Hinzufügen nicht komprimierter Dateien - ZipArchive.CreateEntry(..., CompressionLevel.NoCompression).

Wenn Sie 4.5 Version des Frameworks verschieben könnte GZipStream unterstützt Komprimierungsstufen - so können Sie. GZ-Dateien ohne Komprimierung schreiben - GZipStream.

1

Während es wahrscheinlich möglich ist, bin ich ziemlich sicher, dass es die Datei teilweise oder vollständig unlesbar machen wird, weil die unkomprimierten Daten, die Sie anhängen, nicht mit der gzip-Formatspezifikation übereinstimmen. Ich sollte auch beachten, dass GzipStream keine Möglichkeit bietet, Dateien aus dem Archiv hinzuzufügen oder zu extrahieren, und Sie vielleicht in die ZipArchive-Klasse schauen möchten.

Verwandte Themen