【问题标题】:quick and dirty way to recursively collect files from sub directories?从子目录递归收集文件的快速而肮脏的方法?
【发布时间】:2013-06-09 01:35:06
【问题描述】:

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

    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?然后对父项中的内容进行第三次传递。感觉有点草率,我觉得有一些像 dirC.getAllsub() 这样的命令会为我这样做?只是寻找提示和想法来清理代码。

【问题讨论】:

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

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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        我想把它写成评论,但 stackoverflow 不允许。

        查看this question,它提供了多种方式来满足您的要求。

        【讨论】:

          【解决方案5】:

          使用 Directory.GetFiles:

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

          【讨论】:

            猜你喜欢
            • 2018-10-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-11-24
            • 2010-09-15
            • 2011-01-15
            • 2010-10-08
            • 1970-01-01
            相关资源
            最近更新 更多