2011-03-11 123 views
1

這段代碼很好地清除了IECache,但它似乎應該永遠循環......爲什麼不呢? 結果只是輸出什麼和不會被刪除到富文本框。爲什麼不能永遠循環?

謝謝你的答案...

public void delIECache(RichTextBox results) 
     { 
      results.Text += "Deleting IE Cache" + "\n"; 
      DirectoryInfo IECache = new DirectoryInfo(Environment.GetFolderPath(Environment.SpecialFolder.InternetCache)); 
      MessageBox.Show(IECache.ToString()); 
      this.ClearFolder(IECache,results); 
     } 
     public void ClearFolder(DirectoryInfo diPath,RichTextBox results) 
     { 
      foreach (FileInfo fiCurrFile in diPath.GetFiles()) 
      { 
       try 
       { 
        fiCurrFile.Delete(); 
        results.Text += " " + fiCurrFile + " Successfully Deleted \n"; 

       } 
       catch 
       { 
        results.Text += " " + fiCurrFile + " Not Deleted \n"; 
       } 
      } 
      foreach (DirectoryInfo diSubFolder in diPath.GetDirectories()) 
      { 
       ClearFolder(diSubFolder,results); 
      } 
+7

爲什麼要它永遠循環下去? – casablanca

+0

爲什麼會永遠運行? – user634618

+0

什麼讓你覺得它應該永遠循環? – codymanix

回答

0

diPath.GetFiles()在循環,不是每一個迭代開始只執行一次。

0

我不知道C#,但是當沒有更多的子目錄時,會發生遞歸的基本情況。在這種情況下,您不要調用ClearFolder。

0

「foreach」不是面向流的。它只看該集合中目前的內容。你需要保持這種運行「永遠」嗎?

0

它遞歸地遍歷所有的文件夾和它們的子文件夾,但除非有一個圓形的關係(你不能在你的文件夾樹中),你將會到達文件夾樹的底部在某一點。這一點是當遞歸停止和方法退出

2

因爲在正常情況下,你最終會打沒有子文件夾的文件夾,遞歸的分支將結束。

它可能永遠運行的一種方式(從來沒有嘗試過,但理論上聽起來可能)是如果你有循環文件夾symbolic links

+1

或NTFS中的遞歸[Junction Point](http://en.wikipedia.org/wiki/NTFS_junction_point)。 – 2011-03-11 21:53:39

+0

@pst不是聯結點只是一個符號鏈接的具體實現嗎?來自連接點維基百科的文章:「在計算中,NTFS連接點是NTFS文件系統的一個特性,它提供了創建符號鏈接到目錄的能力,然後該目錄作爲該目錄的別名」 – Davy8

+0

@Dave看起來像我已經走出了一圈:[NTFS符號鏈接](http://en.wikipedia.org/wiki/NTFS_symbolic_link) – 2011-03-11 22:33:17

0

它看起來像正確的循環。但是,也許你有巨大的IE緩存,它需要很長時間(幾分鐘)來逐個刪除文件。

0

如果此目錄只包含有限數量的文件,則它將不會永久循環。 這可能會永遠循環的唯一方法是,如果至少有一個目錄包含指向自己的硬鏈接/連接或直接或間接包含此目錄的目錄。

處理完所有文件和所有子文件夾後,方法就完成了。當且僅當當前目錄具有子目錄時,該方法才調用它自己。

0

說我有以下目錄樹:

IECache 
|- IECache1 
    |- IECache1a 
|- IECache2 
|- IECache3 

這些都是目錄,這裏的文件並不重要。

  1. DirectoryInfo對象IECache
    1. 呼叫ClearFolderDirectoryInfo對象IECache1
      1. 呼叫ClearFolderDirectoryInfo對象IECache1a
      2. 返回調用ClearFolder調用ClearFolder
    2. DirectoryInfo對象IECache2
    3. 呼叫ClearFolderDirectoryInfo對象IECache3
    4. 返回調用ClearFolder調用ClearFolder
  2. 返回到delIECache