2009-09-11 40 views
0

IT的任務是降低文件服務器的使用率,所以我想盡我所能壓縮舊文件(即Excel/Access/Txt)。C# - 根據年份自動壓縮文件夾中的文件

我們有一些文件夾包含數以千計的文件,所以我不想只將整個目錄壓縮成一個大文件 - 最好是有一些較小的文件,以便用戶更容易找到他們正在尋找的數據「桶」。

有沒有一種使用C#讀取目錄並將文件壓縮成年份組(年份放在一個zip中的所有文件)的方法?

或者使用像AutoIT這樣的腳本會更好嗎?

還是有程序已經存在這樣做,所以我不必編碼任何東西?

+0

我想說這應該在ServerFault或超級第一... –

+0

問好了,如果他真的想使自己的程序進行這個,#2是正確的要問的地方 –

+0

您的IT部門應該使用NTFS,然後他們只需檢查「壓縮內容以節省磁盤空間」。 – 2009-09-11 16:44:02

回答

4

林不知道你的問題是關於壓縮,從特定年份/月或兩者選擇文件。

關於壓縮彼得已經提到7-zip和SharpZipLib。我個人只有後者的經驗,但它的所有積極,容易處理。

關於對文件進行分組,可以通過迭代文件夾中的所有文件並通過創建日期或上次修改日期對它們進行分組來完成。

僞:

var files = new Dictionary<DateTime, IList<string>>(); 
foreach (var file in Directory.GetFiles(...)) { 
    var fi = new FileInfo(file); 
    var date = fi.CreatedDate(); 
    var groupDate = new DateTime(date.Year, date.Month); 

    if (!files.ContainsKey(groupDate)) files.Add(groupDate, new Collection<string>()); 

    files[groupDate].Add(file); 
} 

現在您應該包含不同的年/月鍵和foreach鍵屬於該組的文件列表的字典。因此,對於荏苒

僞:

foreach (var entry in files) { 
    var date = entry.Key; 
    var list = entry.Value; 

    // create zip-file named date.ToString(); 
    foreach (var file in list) { 
     // add file to zip 
    } 
} 
2

當然,您可以使用一些C#和庫如7-zipSharpZipLib來做到這一點。

2

您可以使用System.IO.Directory.GetFiles()遍歷每個目錄中的文件,通過文件名解析出來並將它們添加到7-zip或SharpZipLib對象中。如果它是成千上萬的文件,最好把它放在一個服務或某種計劃任務中運行一夜,以免對文件共享徵稅。

祝你好運!

編輯:作爲附錄,如果您需要通過創建日期或其他文件屬性解析,可以爲每個文件使用System.IO.FileInfo對象。

+0

+1它可能僅僅是一個低優先級的線程,並且每隔一段時間睡眠一次,以保持磁盤I/O低。我個人更喜歡編碼而不是使用第三方解決方案,因爲它是一個很好的C#練習(一旦你下載了SharpZipLib,它不應該超過15分鐘)。 :) – Groo