2010-10-05 55 views
8

我想在C#中使用deflate/gzip流,但它看起來壓縮後的文件比以前更大。GZipStream和DeflateStream產生更大的文件

例如,我壓縮一個900ko的docx文件,但它產生了一個1.4Mo!

它爲我嘗試過的每個文件都做到了。

可能是我在做錯了嗎?這裏是我的代碼:

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(); 
+1

你一定要明白,這將通過至少一個字節壓縮*任意*輸入的壓縮方法不能存在?特別是如果你試圖壓縮已經接近隨機的數據,例如預壓縮數據,您可能會看到尺寸增加。 – Joey 2010-10-05 13:30:31

+3

.docx已經使用ZIP壓縮壓縮(嘗試重命名爲.zip並進行探索)。如果第二級壓縮會產生任何好處,我會感到驚訝。 – spender 2010-10-05 13:33:54

+0

它應該只對沖洗進行有效的壓縮,所以它不應該改變一個東西 – kite 2010-10-05 13:34:19

回答

7

這麼大的差別覺得奇怪,我,但你應該記住,docx本身的ZIP壓縮,因此沒有理由再壓縮,結果通常是更大的。

+0

確認:http://www.myformatfactory.com/DOCX – 2010-10-05 13:38:40

+0

是的,謝謝,我不知道它,這就是爲什麼它沒有工作:)嘗試與.txt和其他格式,它似乎更好。但它仍然不適用於自制的序列化文件類型......但最後並不重要,只是想看看如何使用這些壓縮流:) – kite 2010-10-05 13:38:46

-2

我不認爲GzipStream和DeflateStream旨在壓縮文件。你可能會用像SharpZipLib這樣的文件壓縮器運氣好些。

+0

它們是用來壓縮和解壓縮的。我目前正在閱讀MCTS 70-536認證書,他們在那裏使用^^ – kite 2010-10-05 13:40:28

+0

,它們是什麼? http://msdn.microsoft.com/en-us/library/system.io.compression.gzipstream.aspx「GZipStream類提供用於壓縮和解壓縮流的方法和屬性。」 – Andrey 2010-10-05 13:41:19

+0

他們完全擅長壓縮文件,而且在很多情況下比zip更方便,因爲它們直接處理文件而不是創建存檔,並且可以直接從Web服務器輸出它們,而不是每次都進行壓縮。將.gz附加到名稱(在原始擴展名之後而不是替換它)對於gzip文件來說很常見。但並不是說SharpZipLib在許多情況下並不是更好。 – 2010-10-05 13:44:03

2

首先,相比於拉鍊,7Z,等時放氣/ gzip的流是在壓縮顯着壞

其次,DOCX(和所有的MS的文件格式具有「X」在端部)都只是反正.zip文件。將.docx重命名爲.zip以顯示煙霧和鏡像。

因此,當你在defx/gzip上運行docx時,它實際上會使文件變大。 (就像做一個zip壓縮文件時壓縮比較低,壓縮比較高)。

但是如果你運行deflate/gzip而不是HTML或者文本文件或者沒有被壓縮的東西,它會實際上做得很好。

+0

是的,謝謝,正如其他評論中所說,不知道docx已經被壓縮了。並確信7z和其他庫更好,但只是想試試看看他們能做什麼 – kite 2010-10-05 13:41:39

+2

這似乎是一個完全無效的評論:*壓縮相比,zip壓縮,7z壓縮非常不好,等等*。事實上,99%的zip文件使用DEFLATE作爲壓縮格式。因此,zip可以比DEFLATE更好*,因爲它使用元數據增強了壓縮流。 – Cheeso 2011-05-08 15:58:53

+0

DeflateStream實際*增加了以前壓縮數據的大小的現象是2006年微軟打開的一個bug的主題:https://connect.microsoft.com/VisualStudio/feedback/details/93930/ gzipstream-deflatestream-fail-to-check-for-incompressible-data – Cheeso 2011-05-08 15:59:50

0

雖然它是真實的,正如其他人所指出的,示例文件規定已經被壓縮你 - 最大的問題是要明白,不像大多數的壓縮工具,將DeflateStreamGZipStream類簡單地嘗試來標記/壓縮數據流時沒有所有額外令牌(開銷)實際上增加了所需數據量的智能。 Zip,7z等足夠聰明地知道,如果數據主要是隨機熵(幾乎不可壓縮),那麼他們只是按原樣存儲數據(存儲,而不是壓縮),而不是試圖進一步壓縮數據。

+1

這不是真的:* Zip,7z等足夠聰明地知道如果數據主要是隨機熵(幾乎不可壓縮),那麼他們只是將數據「原樣」(存儲,而不是壓縮),而不是試圖進一步壓縮。* ZIP僅僅是一種文件格式。它不會「知道」任何東西。一個產生ZIP文件的程序可能會做你所描述的,但是ZIP格式不會。 – Cheeso 2011-05-08 16:00:34

+1

DeflateStream實際*膨脹的現象*以前壓縮數據的大小是已經用Microsoft打開的錯誤的主題:https://connect.microsoft.com/VisualStudio/feedback/details/93930/gzipstream-deflatestream -fail-check-for-incompressible-data – Cheeso 2011-05-08 16:02:06

+0

不是在談論格式(好悲傷)。正在討論以相應格式寫入數據的壓縮實用程序。 – Michael 2011-06-13 15:03:44

0

我對壓縮包含jpg數據的數據庫有同樣的問題。我試圖dotnetzip - 在更換下降,得到了很好的壓縮(支持Compact Framework的呢!):

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