2011-01-25 92 views
4

問候大型歸檔文件的....壓縮問題與DotNetZip

我在C#3.5編寫的備份程序,使用興田最新DotNetZip。該程序的基礎知識將被賦予一個服務器上的位置和一個跨越的zip文件的最大大小,然後去。從那裏它應該遍歷給定位置的所有文件夾/文件,並將它們添加到存檔中,保持確切的結構。它也應該壓縮一切合理的數量。一個給定的未壓縮的文件夾/文件集合可以很容易地爲10-25gb,創建的跨文件被限制在每個大約1gb。

我有一切工作(使用DotNetZip)。我唯一的挑戰就是實際發生的事情很少或根本沒有。爲了簡化代碼,我選擇使用「AddDirectory」方法,並且一般來說它看起來好像適合我的項目。經過閱讀,我第二次猜測這個決定。

  1. 考慮下面的代碼並存檔中的大量文件,我應該壓縮每個文件,因爲它被添加到壓縮?或者Adddirectory方法應該提供相同的壓縮?

  2. 我已經嘗試了Ionic.Zlib.CompressionLevel提供的每個級別的壓縮,但似乎沒有任何幫助。我應該考慮使用外部壓縮算法並將其流式傳輸到我的DotNetZip文件中嗎?

using (ZipFile zip = new ZipFile()) 
{ 
    zip.AddDirectory(root.FullName); 

    if (zipPassword.Length > 0) 
    zip.Password = zipPassword; 

    float size = zipGbSize * 1024 * 1024 * 1024; 

    zip.CompressionLevel = Ionic.Zlib.CompressionLevel.BestCompression; 
    zip.AddProgress += new EventHandler<AddProgressEventArgs>(Zip_AddProgress); 
    zip.ZipError += new EventHandler<ZipErrorEventArgs>(Zip_ZipError); 
    zip.Comment = "This zip was created at " + System.DateTime.Now.ToString("G"); 
    zip.MaxOutputSegmentSize = (int)size; //in gig 
    zip.Name = archiveDir.FullName + @"\Task_" + taskId.ToString() + ".zip"; 
    zip.Save(); 
} 

感謝您的幫助!

回答

2

1.給下面的代碼和檔案中的大量文件,我應該壓縮每個文件,因爲它被添加到壓縮?

DotNetZip的工作方式是壓縮每個文件,因爲它被添加到存檔。你的應用程序不需要進行壓縮。 DotNetZip爲你做這個。

或者應該Adddirectory方法提供大約相同的壓縮?

條目添加到經由AddDirectory()方法經過相同的代碼路徑zip存檔被寫入時,經由AddFile添加的條目()的zip文件。文件數據被壓縮,然後選擇加密,然後寫入zip文件。


的主動提示:你不需要做:

zip.AddProgress += new EventHandler<AddProgressEventArgs>(Zip_AddProgress); 

,你可以這樣做:

zip.AddProgress += Zip_AddProgress; 

你怎麼確定沒有壓縮發生?

如果您對每個條目的壓縮感興趣,可以註冊一個SaveProgress事件處理程序。 SaveProgress事件會在寫入檔案的過程中的不同時間觸發,包括保存開始,DotNetZip開始爲一個條目寫入數據,在寫入一個條目期間的不同時間間隔,完成每個條目的數據寫入後,以及完成寫入所有數據後。這些階段在the ZipProgressEventType enumeration中描述。當EventType爲Saving_AfterWriteEntry時,可以計算該特定條目的壓縮比率。

要驗證壓縮沒有發生,我建議您註冊一個SaveProgress事件並查看該壓縮比率。

另外,如上所述,某些文件類型不能被壓縮。 JPG,MPG,MP3,ZIP文件和其他文件不是非常可壓縮的。


最後,如果您只是使用DotNetZip命令行工具,則執行備份可能會容易很多。如果您只想備份特定目錄,則可以使用命令行工具(zipit.exe)並避免編寫程序。使用zipit.exe工具,如果使用-v選項,該工具將打印進度報告,並將通過上述機制顯示每個條目的壓縮。即使您更願意編寫自己的程序,也可以考慮在使用DotNetZip時使用zipit.exe來驗證壓縮是否發生。

2

我不確定要低估你的問題,但任何zip文件的最大尺寸爲its 4Gb。也許你每次達到這個限制時都必須創建一個新的ZipFile

對不起,如果這不幫助你。

+0

由於該限制(z01,z02,z03 ....),正在拆分zip文件。每個分割是1GB,以及也是大約1GB的「父」壓縮。 – David 2011-01-26 16:01:53

1

你壓縮什麼樣的數據?某些數據壓縮得不好,例如JPEG或壓縮的ZIP文件。

+1

這是所有普通文件的混亂。文檔,圖片,下載,pdf等。公司中的每個人都有一個共享驅動器到服務器。我想要備份服務器上的所有文件。 – David 2011-01-26 16:00:19

+2

docx,xl​​sx文件等也是zip文件。大多數圖片格式都被壓縮。我的猜測是大多數源文件都是不可壓縮的。 – phoog 2011-01-31 01:32:47