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

C# 获取路径中的所有文件(递归),c#,C#,我编写了一个方法,需要查找路径中的所有文件,我希望使用递归获取所有文件。以下是我目前的方法: public void doStart(DirectoryInfo dir, string filePattern) { try { foreach (FileInfo fileInfo in dir.GetFiles(filePattern)) {

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

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

有没有更好的方法来编写这种递归,或者这已经足够好了?

试试这样的方法:

string[] filePaths = Directory.GetFiles(@dir, "*.filetype", SearchOption.AllDirectories);
这将递归地查找目录,查找具有特定文件类型('.filetype')的所有文件,并返回包含所有找到的文件的字符串数组

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

此外,如果子目录中有子目录,DoStart()方法会做什么?据我所见,我认为它只搜索1个子级别

  • 不要接受所有的例外。如果您需要忽略特定的异常,请捕获这些异常,但让其他异常冒泡
  • (样式)应使用PASCALCASE方法(例如,
    DoStart
    和'FileFound'
  • (风格)创建一个
    OnFileFound
    方法,而不是直接调用
    FileFound
    (我假设
    FileFound
    是一个事件处理程序?)

  • 除此之外,我觉得它还不错。

    这里是一个真正递归的示例。与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;
            }
        }
    }
    
    公共IEnumerable GetFilesRecursive(字符串ParentDirectory) { string[]subDirectories=Directory.GetDirectories(ParentDirectory); foreach(Directory.GetFiles(ParentDirectory)中的字符串文件) { 生成返回文件; } foreach(子目录中的字符串子目录) { foreach(GetFilesRecursive(子目录)中的字符串文件) { 生成返回文件; } } }
    代码搜索此代码中的所有子目录:
    foreach(DirectoryInfo dirInfo in dir.GetDirectories()){doStart(dirInfo,filePattern);}
    @NikolaDavidovic根据MSDN,它不(),它只获取当前目录的子目录。这就像一个符咒,而且速度非常快。只要不将@Dir设置为“c:\\”但除此之外,这是一个很好的代码StefanM@DJKRAZE在使用文件路径时,我倾向于使用“@”,因为我总是忘记转义“\”。我不确定其中哪一个会更快,但我不认为这些选项之间的速度有很大差异(如果有的话)。你的答案很准确..我只是在测试它并尝试了“c:\”例如,它抛出了一个异常,我无法访问某些文件夹。。