2012-04-26 66 views
0

就像主題說的,這是我的代碼。如果光盤空間在X-GIG下並且自創建以來超過X天,則刪除DIRECTORY! C#/ NET

public void deleteOldShit() 
{ 
String path = textBox1.Text ; 
Int32 days = Convert.ToInt32(oldRelease.Text); 
Int32 neededSpace = Convert.ToInt32(discSpace.Text); 
String[] folders = Directory.GetDirectories(path, "*".ToString(), SearchOption.AllDirectories); 

foreach (String folder in folders) 
{ 

    DirectoryInfo source = new DirectoryInfo(folder); 
    String k = Directory.GetDirectoryRoot(path); 
    k = k.Replace(@":\", ""); 
    DriveInfo c = new DriveInfo(k); 
    Double cAvailableSpace = c.AvailableFreeSpace/Math.Pow(1024, 2); 


    // Get info of each file into the directory 
    foreach (DirectoryInfo fi in source.GetDirectories()) 
    { 
     var creationTime = fi.CreationTime; 

     if (creationTime < (DateTime.Now - new TimeSpan(days, 0, 0, 0))) 
     { 
      if (cAvailableSpace < neededSpace) 
      { 
        Directory.Delete(folder,true); 
      } 
     } 
    } 
} 
} 

查看x天后刪除文件,但日期/時間的比較似乎是錯誤。

這裏的任何指針都會很酷。我似乎無法找到答案。

+0

你能告訴我們你所期望的,當你運行它,而是會發生什麼? – 2012-04-26 21:27:16

+0

它運行,沒什麼more.it掃描文件夾,我可以看到他們通過列表框時,我測試..但超過X天的文件夾仍然在我的文件夾。即時運行管理員模式 – 1244 2012-04-26 21:29:23

+0

您運行的是什麼版本的Net Framework? – Sparky 2012-04-26 21:49:13

回答

1

我的猜測是該行沒有工作,你如何期望:

if (creationTime < (DateTime.Now - new TimeSpan(90, 0, 0, 0))) 

這條線是防止文件夾刪除,除非該文件夾的創建超過90天前。而且,實際的「X天」的代碼似乎是錯的,以及(儘管它可能沒有達到)

if (fi.CreationTime < DateTime.Now.AddDays(days)) 

如果代碼是有史以來達到,這將總是刪除你的文件,除非你創造他們在未來,或在你的方框中輸入一個負數。


雖然這裏還有其他的麻煩。一旦你開始刪除目錄,出於兩個原因,我可以馬上看到你將會出現異常。

  1. 刪除其包含的目錄後,您不檢查子目錄是否仍然存在。如果您刪除c:\myFiles,然後您的代碼接下來檢查c:\myFiles\other,則會出現錯誤,因爲您的代碼將嘗試檢查不存在的目錄上的屬性。您應該首先檢查Directory.Exists()

  2. 除非目錄爲空,否則您的目錄刪除代碼將不起作用。還有第二個bool參數,您需要通過true才能刪除其中包含的文件和文件夾。


最後,只是可以肯定的說;你的代碼並沒有真正檢查,以確保你沒有進入危險的目錄,所以要小心! :)

+0

做了一個更新,並糾正我猜你的權利,但我沒有在這裏不速之客atm。所以它的行事,它試圖找到日期不同這是我主張的主要issiue? – 1244 2012-04-26 21:46:34

0

我認爲你正試圖刪除錯誤的目錄:

foreach (String folder in folders) 
    { 

     DirectoryInfo source = new DirectoryInfo(folder); 
     String k = Directory.GetDirectoryRoot(path); 
     k = k.Replace(@":\", ""); 
     DriveInfo c = new DriveInfo(k); 
     Double cAvailableSpace = c.AvailableFreeSpace/Math.Pow(1024, 2); 


     // Get info of each file into the directory 
     foreach (DirectoryInfo fi in source.GetDirectories()) 
     { 
      var creationTime = fi.CreationTime; 

      if (creationTime < (DateTime.Now - new TimeSpan(days, 0, 0, 0))) 
      { 
       if (cAvailableSpace < neededSpace) 
       { 
         **/* Trying to delete Folder, but should be FI.Fullname */** 

        try 
         { 
         Directory.Delete(folder,true); 
         } 
        catch(Exception e) 
         { 
Console.WriteLine("The process failed: {0}", e.ToString()); 
         } 
       } 
      } 
     } 
    } 
    } 
+0

foreach(文件夾中的字符串文件夾) 去槽文件夾被刪除.. – 1244 2012-04-26 21:59:18

+0

但是,您取文件夾名稱,然後執行該文件夾上的GetDirectories()。你通過文件夾中的目錄編碼循環,如果其中任何一個符合你的條件,試圖刪除父文件夾......不知道這是否是你的意圖。 – Sparky 2012-04-26 22:04:09

+0

if(creationTime <(DateTime.Now - new TimeSpan(days,0,0,0))) 在此行之後什麼也沒有被打印出來的接縫。我的文件夾已超過1周.. – 1244 2012-04-26 22:06:10

相關問題