Komprimieren mit GZipStream

7

Ich versuche zu verstehen, warum mein Code nicht wie gewünscht ausgeführt wird. Es erstellt einen GZipStream und speichert dann das Objekt als komprimierte Datei auf meiner Festplatte, aber die gespeicherte Datei ist immer 0 Bytes.

Jetzt weiß ich, wie man eine Datei mit GZipStream speichert , aber meine Frage ist nicht, wie es geht. Meine Frage ist rein, warum speichert dieser Code 0 Bytes (oder warum FileStream funktioniert und Speicher nicht).

%Vor%

In Bezug auf den Quellcode ist this.fileName = c:\Audio.wav und newFileName ist c:\Audio.wav.gz (habe aber auch c:\audio.gz versucht)

    
Dave 12.01.2013, 19:27
quelle

3 Antworten

9
  • Sie benötigen keinen MemoryStream, da bytes bereits die zu komprimierenden Daten enthält.
  • ms.ReadByte() sollte nicht verwendet werden.
  • Beim Erstellen von zipStream sollte der Ausgabedatei-Stream verwendet werden.

Versuchen Sie Folgendes:

%Vor%

BEARBEITEN

Der ursprüngliche Code erstellt eine Datei mit der Länge Null, da Sie nicht in den Dateistream schreiben.

    
Richard Schneider 12.01.2013, 19:40
quelle
7

Wenn Sie GzipStream oder DeflateStream aus dem Namespace System.IO.Compression verwenden, wird die Stream , die Sie im -Konstruktor angeben, für in geschrieben > Komprimierung und Lesen von in Dekomprimierung .

Da Sie versuchen, die Daten hier zu komprimieren, ist die Verwendung von MemoryStream falsch, da Sie nicht versuchen, sie zu komprimieren, sondern sie stattdessen als Datenquelle zu verwenden. Also sollte Ihre MemoryStream die Eingabe Stream und die FileStream Ihre Ausgabe sein.

Ich empfehle Ihnen, MemoryStream als Datenquelle über die rohe byte[] zu verwenden, da Stream viel mehr Vielseitigkeit und Anwendung hat ( FileStream , NetworkStream , CryptoStream , etc.)

Hier sind einige Beispiele, die das Muster async / await verwenden:

%Vor%

HINWEIS: Rufen Sie immer GzipStream.Close() auf, bevor Sie die Eingabe oder Ausgabe Stream schließen. Beim Schließen / Ablegen wird der Puffer zuletzt gespült, und wenn der -Eingabe oder -Ausgabe zuerst geschlossen wird, wird eine Ausnahme ausgelöst, wenn er dies versucht. (Dies gilt auch für DeflateStream )

    
Erik 12.01.2013 20:40
quelle
2
%Vor%

Da der Hintergrundspeicher von MemoryStream Ihr RAM-Speicher ist, nicht die Festplatte. Wenn Sie MemoryStream object an GZipStream constructor übergeben, befindet sich gzip nur im RAM.

Mit diesem Code:

%Vor%

Sie erstellen einen neuen FileStream, aber Sie haben ihn nicht verwendet. Um gzip mit diesem FileStream zu speichern, müssen Sie es an GZipStream constructor übergeben, damit es als Backup-Speicher auf der Festplatte gespeichert wird.

    
SergeyS 12.01.2013 19:38
quelle

Tags und Links