Frage

Ich versuche zu verwenden deflate / gzip-Streams in C #, aber es scheint, dass die Dateien nach der Komprimierung größer sind als zuvor.

Zum Beispiel komprimiere ich eine docx-Datei von 900ko, aber es produziert eine 1.4Mo ein!

Und sie tut es für jede Datei, die ich versuchte.

Auch in der Art, wie ich bin falsch, ich es tue? Hier ist mein Code:

  FileStream input = File.OpenRead(Environment.CurrentDirectory + "/file.docx");
  FileStream output = File.OpenWrite(Environment.CurrentDirectory + "/compressedfile.dat");

  GZipStream comp = new GZipStream(output, CompressionMode.Compress);

  while (input.Position != input.Length)
      comp.WriteByte((byte)input.ReadByte());

  input.Close();

  comp.Close(); // automatically call flush at closing
  output.Close();
War es hilfreich?

Lösung

So ein großer Unterschied zu mir scheint seltsam, aber man sollte bedenken, dass docx sich in ZIP-komprimiert, so dass es keinen Grund gibt, es wieder zu komprimieren, sind die Ergebnisse in der Regel größer.

Andere Tipps

Zur einem deflate / gzip Ströme sind bemerkenswert schlecht bei der Kompression im Vergleich zu zip, 7z, usw.

Zweitens, docx (und alle der MS Dokumentenformate mit einem ‚x‘ am Ende) sind nur ZIP-Dateien sowieso. Umbenennen einer .docx in .zip den Rauch und Spiegel zu offenbaren.

Also, wenn Sie laufen deflate / gzip über einen docx, wird es tatsächlich die Datei größer. (Es ist wie mit einem Reißverschluss mit einem niedrigen Grad der Komprimierung über eine ZIP-Datei mit einem hohen Maße an Kompression zu tun.)

Wenn Sie jedoch deflate run / gzip über HTML oder eine Textdatei oder etwas, das dann nicht komprimiert wird, wird es tatsächlich eine ziemlich gute Arbeit tun.

Auch wenn es wahr ist, wie andere schon angedeutet haben, dass die Beispieldateien, die Sie bereits komprimiert angegeben sind - das größte Problem ist, dass im Gegensatz zu den meisten Komprimierungsprogramme zu verstehen, die DeflateStream und GZipStream versuchen Klassen einfach zu tokenize / komprimieren, ohne die Intelligenz eines Datenstroms, der alle zusätzlichen Token (Overhead) sind erforderlich, um die Datenmenge tatsächlich erhöht. Zip, 7z, etc. sind intelligent genug, um zu wissen, dass, wenn die Daten weitgehend zufällig Entropie (praktisch nicht komprimierbare), dass sie einfach die Daten speichern „wie sie ist“ (Laden, nicht komprimiert), anstatt zu versuchen, es weiter zu komprimieren.

Ich hatte das gleiche Problem mit Komprimieren Datenbanken jpg Daten enthält. Ich habe versucht, DotNetZip - ein direkter Ersatz und bekam anständige Kompression (unterstützt Compact Framework auch!):

MS : 10MB -> 10.0MB
DNZ: 10MB ->  7.6MB

Ich glaube nicht, GZipStream und DeflateStream zu komprimieren Dateien gedacht sind. Sie würden wahrscheinlich mehr Glück mit einem Datei Kompressor haben wie SharpZipLib .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top