2011-03-11 3 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

Это рекурсивный, но в конце концов он закончится, когда он дойдет до конца каждого подкаталога. Википедии есть немного слишком много информации об этом, но есть некоторые подробные объяснения по рекурсивному программированию: http://en.wikipedia.org/wiki/Recursion_(computer_science)

0

я не знаю, C#, но базовый случай в вашей рекурсии не происходит, когда нет больше подкаталогов. В этом случае вы не вызываете ClearFolder.

0

"foreach" не ориентирован на поток. Он смотрит только на то, что в настоящее время находится в коллекции. Вам нужно, чтобы это выполнялось «навсегда»?

0

Он рекурсивно просматривает все папки и их вспомогательные папки, но если бы не было кругового корабля отношения (которого вы не можете иметь в дереве папок), вы собираетесь добраться до нижней части дерева папок в какой-то момент. Этот момент заключается в том, когда рекурсия прекращается и метод выходит из

2

Потому что при нормальных обстоятельствах вы, в конце концов, попадете в папки, у которых нет подпапок, и те ветви рекурсии закончатся.

Один из способов, которым он может работать вечно (никогда не пробовал это, но звучит возможно в теории), если у вас есть циклическая папка с symbolic links.

+1

Или рекурсивная [точка соединения] (http://en.wikipedia.org/wiki/NTFS_junction_point) в NTFS. –

+0

@pst Не является точкой соединения только определенной реализации символической ссылки? Из статьи точки соприкосновения Wikipedia: «При вычислении точка соединения NTFS является функцией файловой системы NTFS, которая обеспечивает возможность создания символической ссылки на каталог, который затем выполняет функции псевдонима этого каталога» – Davy8

+0

@Dave Похоже, Я некоторое время был вне цикла: [Символьные ссылки NTFS] (http://en.wikipedia.org/wiki/NTFS_symbolic_link) –

0

Похоже на правильную петлю. Но, возможно, у вас огромный кеш IE, и для удаления файла по файлу требуется много времени (несколько минут).

0

Если этот каталог содержит только конечное количество файлов, он не будет навечно зацикливаться. Единственный способ, которым это может зацикливаться навсегда, будет, если хотя бы один каталог содержит жесткую ссылку/соединение, которая ссылается на себя или на каталог, который прямо или косвенно содержит этот каталог.

Когда все файлы и все подпапки обрабатываются, метод выполняется. Метод вызывает себя тогда и только тогда, когда текущий каталог имеет подкаталоги.

0

Скажет, у меня есть следующее дерево каталогов:

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

все эти каталоги как файлы здесь не важны.

  1. вызовы ClearFolder с DirectoryInfo объекта для IECache
    1. вызовов ClearFolder с DirectoryInfo объекта для IECache1
      1. вызовов ClearFolder с DirectoryInfo объекта для IECache1a
      2. Возвращения называть ClearFolder
    2. вызовы ClearFolderDirectoryInfo с объектом для IECache2
    3. Вызовы ClearFolderDirectoryInfo с объектом для IECache3
    4. Возвращения называть ClearFolder
  2. Возврат к delIECache
Смежные вопросы