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)
bytes
bereits die zu komprimierenden Daten enthält. ms.ReadByte()
sollte nicht verwendet werden. 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.
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:
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
)
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.