2010-06-22 62 views
0

上週我有個問題,你很快就緩解了任何會阻礙我的擔憂,希望你能再次幫助一個初學者計劃!使用前3個字母排序文件,而不是刪除舊文件?

我試圖自動化我的日常世俗任務之一,它是一個相當的bug手I腳,我想主要是因爲我沒有采取正確的方法。

每天早上我會瀏覽一個系統目錄,其中包含許多具有相同前綴的文件以及後面生成的數字。我必須先按字母順序排序,然後刪除該文件的最舊版本。

這裏是我的目錄的示例圖:http://i.imgur.com/5l2Am.png

我會通過只是名稱排序的文件和前3個字母比較下面的文件來處理這個情況,如果他們是相同的我會刪除(或移動到備份文件夾)第二個文件,直到它們不再匹配,然後我將轉到下一個前綴作爲比較器。

雖然我發現這個問題,但它們並不總是正確排序,我冒險刪除錯誤的文件。

有沒有人有過這種性質的經驗?在我的腦海裏,我可以把所有的東西都放在那裏,但似乎無法將它們連接在一起,主要是因爲我以前從未冒險進入system.IO類,但我想學習!

任何意見是讚賞,如果你想看到我徒勞的嘗試,我會很樂意分享他們:P。

感謝, 尼克

+1

在我看來,對於Windows Powershell來說這是一項很好的任務。 – 2010-06-22 18:18:41

+0

@MartyIX同意。 Powershell是BORN的這種任務。 – 2010-06-22 18:21:38

+0

我現在查看Powershell! – Nicky40 2010-06-22 19:58:14

回答

1

創建由三個字符的前綴索引的字典。

當你達到一個文件,檢查字典的值:

  • 如果不存在,保持文件,並將其添加到字典中,其中關鍵的是前綴和值是多少前綴

  • 如果存在的話,但是有一個較舊的「數量」值以下,歸檔舊,保持較新的一個更新字典有新的號碼

  • 如果存在的話,但一個更新的「數字」值,弧將舊版本更新,保留新版本,此時字典已經更新。

不需要排序。

編輯:添加例子:

public static void ProcessDirectory(string directoryPath) 
    { 
     IDictionary<string,string> prefixDictionary = new Dictionary<string, string>(); 

     if (Directory.Exists(directoryPath)) 
     { 
      foreach(string filePath in Directory.GetFiles(directoryPath)) 
      { 
       string fileName = Path.GetFileName(filePath); 
       string fileDirectory = Path.GetDirectoryName(filePath); 
       if (fileName.Length>=3) 
       {       
        string prefix = fileName.Substring(0, 3); 
        string rightPart = fileName.Substring(3, fileName.Length - 3); 
        if (!prefixDictionary.ContainsKey(prefix)) 
        { 
         prefixDictionary[prefix] = rightPart; 
        } 
        else 
        { 
         string fileToArchive = null; 
         string storedRightPart = prefixDictionary[prefix]; 
         // using string compare, but you could test file date or 
         // or parse the right part as a number if you only cared about 
         // files with numbers on the right. 
         if (String.Compare(storedRightPart,rightPart)<0) 
         { 
          prefixDictionary[prefix] = rightPart; 
          fileToArchive = Path.Combine(fileDirectory,prefix+storedRightPart); 
         } 
         else 
         { 
          fileToArchive = filePath; 
         } 

         if (fileToArchive != null) 
         { 
          // perform the archive here 
         } 
        } 
       } 
      } 
     } 
    } 
+0

我想我跟着你,我不是最自信的編碼器,但我正在學習字典的正確使用。我想我會把你大聲地說清楚。 讓我們來看看我是否可以模擬一些代碼,看看我是否能夠更多地「聚在一起」。 謝謝! – Nicky40 2010-06-22 18:17:49

+0

你是否介意在這裏放下一些代碼讓我開始,我覺得自己像一個蹣跚學步的人,也許我應該從一個更簡單的項目開始,但是如果我能完成這個任務,我可以花時間學習這些東西: P. 謝謝你, 尼克 – Nicky40 2010-06-22 19:13:34

+0

我添加了一個例子。 – David 2010-06-23 14:30:44

3

你應該能夠使用Directory.GetFiles來檢索文件名。我懷疑你的排序問題可能是由於大小寫 - 在C#中,字符串排序,默認情況下,區分大小寫,但文件系統不是。

我建議你加載的文件列表,然後自己對它們進行排序,在C#中,處理它們之前:

List<string> files = Directory.GetFiles(myDirectory) 
    .Select(file => file.ToLower()) // To lower case 
    .OrderBy(file => file) // Sort the files 
    .ToList(); 

// Process the files here... 
0

也就得到的FileInfo對象的數組,其中含有大量的有關這些文件的元數據,這可以讓你對它們進行排序。它也允許你刪除。

DirectoryInfo dir = new DirectoryInfo(@"C:/yourPath"); 
FileInfo[] files = dir.GetFiles(); 

從那裏,你可以通過CreationTimeName或任何排序files。要刪除一個,只需在FileInfo類中使用Delete方法即可。

相關問題