快速和脏的方式递归收集子目录中的文件?

时间:2013-06-12 19:46:00

标签: c# visual-studio-2010 file c#-4.0 directory

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

    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中?然后为父母的东西做第三遍。它感觉abit马虎,我觉得像dirC.getAllsub()这样的命令会为我这样做吗?只是寻找清理代码的提示和想法。

5 个答案:

答案 0 :(得分:2)

Directory.EnumerateFiles()可以传递SearchOption.AllDirectories参数,您可以使用该参数告诉它自动为您递归文件。

您应该可以执行以下操作:

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

答案 1 :(得分:1)

Directory.GetFiles()SearchOption.AllDirectories一起使用。这将自动为你递归。

答案 2 :(得分:1)

我想把它写成评论但是stackoverflow不让我。

查看this question,它提供了许多方法来完成您的要求。

答案 3 :(得分:1)

使用Directory.GetFiles:

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

答案 4 :(得分:1)

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