【问题标题】:How to tell when a recursive method is finished如何判断递归方法何时完成
【发布时间】:2012-06-30 17:41:05
【问题描述】:

在尝试完成重复文件软件时,我注意到 Directory.GetDirectories() 方法存在问题。当文件夹由于某种原因无法访问时(大部分时间是由于文件夹是系统文件夹),循环将停止,因为会引发异常。

经过一些研究,试图找出手动执行递归的最佳方法,我发现Marc Gravell's example 非常适合我的需求。

我对上述方法的问题是我不知道如何知道递归方法何时完成处理任何文件/文件夹。因此,我们将不胜感激有关此事的任何见解。

提前致谢。

【问题讨论】:

  • 你想要一个进度条吗?您可以有一个名为 folderDepth 的成员变量,并在该方法向下遍历文件夹层次结构时递增/递减。在运行该方法之前输入Debug.Write(folderDepth),您将获得一个想法,您可以更好地预测它何时会完成。只是我的 2 美分 :) 现在渴望听到一些答案 +1
  • 目前主要关心的是找出搜索何时完成以向用户输出消息。您对变量的建议意味着我需要知道选定文件夹中已经有多少个文件夹,这是不可能的,至少不能使用 Directory.GetDirectories().Length

标签: winforms file recursion directory


【解决方案1】:

操作完成后放一个消息框:

static void Main()
{
  string path = ""; // TODO
  ApplyAllFiles(path, ProcessFile, FolderProcessed);
  MessageBox.Show("Operation complete.");
}

【讨论】:

  • 嗯,这很尴尬......似乎我的大脑因某种原因停止正常运作,我一直认为在递归发生时线程没有被阻塞。感谢您的帮助。
  • 很高兴能提供帮助,因为您提到了线程,所以最后一点说明 - 请查看此答案中的一些链接:stackoverflow.com/a/10965388/495455
  • 感谢您澄清您对我的问题的评论,但我仍然看不到如何使用流程栏显示流程。您是否不需要知道结果应该是什么以便在某处说明该过程?当前的设计似乎没有提供。使用 Marc Gravell 的示例,似乎无法知道需要递归多少文件,并且使用 Directory.GetDirectories() 可能会出现异常。值得庆幸的是,该计划不涉及说明进度,因为在这种情况下这似乎很难做到。
  • 是的,疯狂的想法,这将导致增加手术时间的可能性 - 听起来很熟悉?尽管many 应用程序采用这种方式给出基本估计。
  • 您在上面提供的链接似乎对这种情况很有用。使用 LINQ 似乎允许您迭代项目而无需等待它处理所有文件,当然最后您可以检查数组包含多少项目。可惜它需要 .net 4.0,因为这对于“休闲”电脑用户来说是一个很大的依赖。
【解决方案2】:

你能澄清一下你想要做什么吗?

在 Marc 提供的示例代码中,您必须提供一个动作,该动作将为发现的每个文件调用,因此调用该动作表示对该文件的处理。

如果您正在寻找一种方法来确定文件夹中的所有文件和子文件夹何时都已处理完毕,则需要修改代码以添加第二个操作。像这样的:

using System;
using System.IO;
static class Program
{
    static void Main()
    {
        string path = ""; // TODO
        ApplyAllFiles(path, ProcessFile, FolderProcessed);
    }
    static void ProcessFile(string path) {/* ... */}
    static void FolderProcessed(string path) {/* ... */}

    static void ApplyAllFiles(string folder, Action<string> fileAction, Action<string> folderProcessed)
    {
        foreach (string file in Directory.GetFiles(folder))
        {
            fileAction(file);
        }
        foreach (string subDir in Directory.GetDirectories(folder))
        {
            try
            {
                ApplyAllFiles(subDir, fileAction);
            }
            catch
            {
                // swallow, log, whatever
            }
        }

        //**** New action invoked here:
        folderProcessed(folder);
    }
}

【讨论】:

  • 这里的问题是我需要知道所有文件或文件夹何时已被处理。根据您所说的,这意味着我已经有一个包含这些对象的数组,我可以检查这些对象以验证是否已处理所有内容,这是问题所在,因为我无法使用任何方法来获取文件夹/文件的数量而没有冒其中一个可能是引发异常的文件夹的风险。
猜你喜欢
  • 1970-01-01
  • 2021-12-04
  • 1970-01-01
  • 1970-01-01
  • 2013-04-10
  • 1970-01-01
  • 2018-03-01
  • 2012-12-04
  • 2013-01-10
相关资源
最近更新 更多