C# 从子目录递归收集文件的快速而肮脏的方法?

C# 从子目录递归收集文件的快速而肮脏的方法?,c#,visual-studio-2010,file,c#-4.0,directory,C#,Visual Studio 2010,File,C# 4.0,Directory,所以我有一个目录,其中存储了一堆配置文件,但现在我还有几个子目录,其中也包含配置文件。我有一个收集每个站点所有配置文件的功能,但现在它只收集目录中的文件,而不是子文件夹中的文件。旧代码: string MasterList = "ConfigsForStation1.txt"; string dirC = "..\\config\\Station1\\"; foreach (FileInfo fileC in dirC.GetFiles()) {

所以我有一个目录,其中存储了一堆配置文件,但现在我还有几个子目录,其中也包含配置文件。我有一个收集每个站点所有配置文件的功能,但现在它只收集目录中的文件,而不是子文件夹中的文件。旧代码:

    string MasterList = "ConfigsForStation1.txt";
    string dirC = "..\\config\\Station1\\";
    foreach (FileInfo fileC in dirC.GetFiles())
            {
                if(!System.IO.Path.GetExtension(fileC.FullName).EndsWith(".confg"))
                {     WriteToList(fileC,MasterList);}

    }
现在有了这个子目录,这些东西实现了它的更多功能:

        string MasterList = ...;
        string dirC = ...;
        //collect files in sub directories substations 1 & 2
        foreach(DirectoryInfo Dx in dirC.GetDirectories())
        {   foreach(FileInfo fileC in Dx.GetFiles())
            {...}
        }
        //collect files in parent directory station 1
        foreach(FileInfo fileC in dirC.GetFiles())
        {...}
我的问题是:有没有更干净的方法从所有子文件夹收集文件,而不是将foreach嵌套在foreach中?然后对parent中的内容进行第三次传递。它感觉有点草率,我觉得有一些命令,比如dirC.getAllsub()可以帮我做到这一点?只是想寻找一些提示和想法来清理代码。

您可以向其中传递一个参数,您可以使用该参数告诉它自动为您递归文件

您应该能够执行以下操作:

foreach (string filename in Directory.EnumerateFiles(dirC, "*.confg", SearchOption.AllDirectories))
    ... Do something with filename
或者,如果您需要处理每个文件:

foreach (string filename in Directory.EnumerateFiles(dirC, "*", SearchOption.AllDirectories))
    ... Do something with filename
您可以向其中传递一个参数,您可以使用该参数告诉它自动为您递归文件

您应该能够执行以下操作:

foreach (string filename in Directory.EnumerateFiles(dirC, "*.confg", SearchOption.AllDirectories))
    ... Do something with filename
或者,如果您需要处理每个文件:

foreach (string filename in Directory.EnumerateFiles(dirC, "*", SearchOption.AllDirectories))
    ... Do something with filename

使用
Directory.GetFiles()
SearchOption.AllDirectories
。这将自动为您重现。

使用
目录.GetFiles()
搜索选项.AllDirectories
。这将自动为您重现。

我想将此作为评论来写,但stackoverflow不允许我这样做


查看提供了许多方法来实现您的要求。

我想写这篇评论,但stackoverflow不让我这么做


查看提供了多种方法来执行您的请求。

使用Directory.GetFiles:

var files = Directory.GetFiles("C:\\", "*", SearchOption.AllDirectories);

使用Directory.GetFiles:

var files = Directory.GetFiles("C:\\", "*", SearchOption.AllDirectories);
GetFiles()
方法将一次性返回所有文件:

String dirC = "..\\config\\Station1\\";
DirectoryInfo di = new DirectoryInfo(dirC);
FileInfo[] fia = di.GetFiles("*.*", SearchOption.AllDirectories);
foreach (FileInfo fi in fia)
{
    //do something with the file
}
您可以将搜索模式
*.
替换为适合您正在查找的文件的任何内容,例如
*.cfg

GetFiles()
方法将一次性返回所有文件:

String dirC = "..\\config\\Station1\\";
DirectoryInfo di = new DirectoryInfo(dirC);
FileInfo[] fia = di.GetFiles("*.*", SearchOption.AllDirectories);
foreach (FileInfo fi in fia)
{
    //do something with the file
}

您可以将搜索模式
*.
替换为任何适合您正在查找的文件,例如
*.cfg

您使用了术语
递归
,但没有实现真正的递归方法。您使用了术语
递归
,但没有实现真正的递归方法。