为什么不循环这个循环?

时间:2011-03-11 21:17:31

标签: c#

这段代码非常适合清除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);
            }

9 个答案:

答案 0 :(得分:2)

因为在正常情况下,您最终会点击没有子文件夹的文件夹,并且递归的那些分支将结束。

它可能永远运行的一种方式(从未尝试过,但理论上听起来可能)是你有symbolic links的循环文件夹。

答案 1 :(得分:0)

diPath.GetFiles()仅在循环开始时执行一次,而不是每次迭代都执行一次。

答案 2 :(得分:0)

它是递归的,但最终它会在到达每个子目录的末尾时结束。 维基百科在这方面有太多的信息,但有一些关于递归编程的详细解释:http://en.wikipedia.org/wiki/Recursion_(computer_science

答案 3 :(得分:0)

我不知道C#,但是当没有更多子目录时,就会出现递归的基本情况。在这种情况下,您不要调用ClearFolder。

答案 4 :(得分:0)

“foreach”不是面向流的。它只关注集合中当前的内容。你需要“永远”保持这种运行吗?

答案 5 :(得分:0)

它递归地遍历所有文件夹及其子文件夹,但除非存在循环关系(你的文件夹树中没有),否则你将到达文件夹树的底部一点。这一点是递归停止并且方法退出

答案 6 :(得分:0)

看起来像是正确的循环。但也许你有巨大的IE缓存,需要很长时间(几分钟)来逐个文件删除它。

答案 7 :(得分:0)

如果此目录仅包含有限数量的文件,则它不会永远循环。 唯一可以循环的方法是,如果至少有一个目录包含引用自身的硬链接/结点或直接或间接包含该目录的目录。

处理完所有文件和所有子文件夹后,方法就完成了。当且仅当当前目录具有子目录时,该方法才会调用自身。

答案 8 :(得分:0)

说我有以下目录树:

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

这些都是目录,因为这里的文件并不重要。

  1. 使用ClearFolder DirectoryInfo对象调用IECache
    1. 使用ClearFolder DirectoryInfo对象调用IECache1
      1. 使用ClearFolder
      2. DirectoryInfo对象调用IECache1a
      3. 返回致电ClearFolder
    2. 使用ClearFolder
    3. DirectoryInfo对象调用IECache2
    4. 使用ClearFolder
    5. DirectoryInfo对象调用IECache3
    6. 返回致电ClearFolder
  2. 返回delIECache