0

我写了一个方法,需要查找路径中的所有文件,并且我想使用递归来获取所有文件。这是我目前的方法:

public void doStart(DirectoryInfo dir, string filePattern)
        {
            try
            {
                foreach (FileInfo fileInfo in dir.GetFiles(filePattern))
                {
                    if (fileFound != null)
                    {
                        fileFound(fileInfo);
                    }
                }
            }
            catch (Exception)
            {

            }

            try
            {
                foreach (DirectoryInfo dirInfo in dir.GetDirectories())
                {
                    doStart(dirInfo, filePattern);
                }
            }
            catch (Exception)
            {

            }
        }

        public void Start(string path, string filePattern)
        {
            doStart(new DirectoryInfo(path), filePattern);
        }

有没有更好的方法来编写这种递归还是足够好?

4

3 回答 3

7

尝试这样的事情:

string[] filePaths = Directory.GetFiles(@dir, "*.filetype", SearchOption.AllDirectories);

这将递归地查看目录,查找具有特定文件类型('.filetype')的所有文件并返回包含所有找到的文件的字符串数组。

另外,我建议不要使用空的 catch 块,因为如果出现问题,您的应用程序不会让您知道。要么显示一个消息框(或类似的东西),要么将其记录到数据库或其他东西。

此外,如果子目录中有子目录,您的 DoStart() 方法会做什么?从我所看到的,我会说它只搜索 1 个子级别。

于 2012-12-18T20:36:49.973 回答
1
  1. 不要吞下所有的例外。如果你需要忽略特定的异常,抓住那些但让其他人冒泡
  2. (风格)方法应该是 PascalCased(例如DoStart和 `FileFound'
  3. (风格)创建一个OnFileFound方法而不是直接调用FileFound(我假设fileFound是一个事件处理程序?)

除此之外,它对我来说看起来不错。

于 2012-12-18T20:37:27.387 回答
0

这是一个真正的递归的例子。与 Directory.GetFiles SearchOption.AllDirectories 不同,这将搜索直到找不到更多子目录。您可以修改它以将搜索过滤器添加为参数。

public IEnumerable<string> GetFilesRecursive(string ParentDirectory)
{
    string[] subDirectories = Directory.GetDirectories(ParentDirectory);
    foreach (string file in Directory.GetFiles(ParentDirectory))
    {
        yield return file;
    }

    foreach (string subDirectory in subDirectories)
    {
        foreach (string file in GetFilesRecursive(subDirectory))
        {
            yield return file;
        }
    }
}
于 2012-12-18T20:49:16.133 回答