获取路径中的所有文件(递归)

时间:2012-12-18 20:31:43

标签: c#

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

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);
        }

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

3 个答案:

答案 0 :(得分:7)

尝试这样的事情:

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

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

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

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

答案 1 :(得分:1)

  1. 不要吞下所有例外。如果您需要忽略特定的例外情况,请抓住这些例外但让其他人冒泡
  2. (style)方法应该是PascalCased(例如DoStart和`FileFound'
  3. (样式)创建OnFileFound方法而不是直接调用FileFound(我假设fileFound是一个事件处理程序?)
  4. 除此之外我觉得很好。

答案 2 :(得分: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;
        }
    }
}