【问题标题】:How can I perform full recursive directory & file scan?如何执行完整的递归目录和文件扫描?
【发布时间】:2011-09-30 02:22:01
【问题描述】:

这是我的代码:

    private static void TreeScan(string sDir)
    {
        foreach (string d in Directory.GetDirectories(sDir))
        {
            foreach (string f in Directory.GetFiles(d))
            {
                //Save file f
            }
        }
        TreeScan(d, client);
    }

问题是它没有得到 sDir (起始目录)FILES,它只得到文件夹和文件在子文件夹中。

我怎样才能让它也从 sDir 中获取文件?

【问题讨论】:

    标签: c# .net search recursion filesystems


    【解决方案1】:

    如果使用 Fx4 及更高版本,EnumerateFiles 方法将返回所有具有高效内存管理的文件,而 GetFiles 可能需要大目录(或驱动器)上的最大资源。

    var files = Directory.EnumerateFiles(dir.Path, "*.*");
    

    【讨论】:

      【解决方案2】:

      您的代码存在一些问题。一方面,您从未从根文件夹中看到文件的原因是因为您在执行和文件读取之前进行了递归。试试这个:

      public static void Main()
      {
          TreeScan(@"C:\someFolder");
      }
      
      private static void TreeScan(string sDir)
      {
          foreach (string f in Directory.GetFiles(sDir))
              Console.WriteLine("File: " + f); // or some other file processing
      
          foreach (string d in Directory.GetDirectories(sDir))
              TreeScan(d); // recursive call to get files of directory
      }
      

      【讨论】:

        【解决方案3】:
        private static void TreeScan( string sDir )
        {
            foreach (string f in Directory.GetFiles( sDir ))
            {
                //Save f :)
            }
            foreach (string d in Directory.GetDirectories( sDir ))
            {
                TreeScan( d ); 
            }
        }
        

        【讨论】:

          【解决方案4】:

          您的 GetFiles 循环应该在 GetDirectories 循环之外。你的 TreeScan 不应该留在 GetDirectories 循环中吗?简而言之,代码应该是这样的:

          private static void TreeScan(string sDir)
          {
              foreach (string d in Directory.GetDirectories(sDir))
              {
                  TreeScan(d, client);
              }
              foreach (string f in Directory.GetFiles(d))
              {
                  //Save file f
              }
          }
          

          【讨论】:

            【解决方案5】:

            不要重新发明轮子,使用GetFiles 的重载允许您指定它搜索子目录。

            string[] files 
                = Directory.GetFiles(path, searchPattern, SearchOption.AllDirectories);
            

            【讨论】:

            • 终于有人懂了。
            • 是的,但递归在第一次使用文件夹 System.UnauthorizedAccessException 保护时失败。
            • 如果您不需要搜索模式,您可以使用星号 (*) 作为搜索模式返回所有目录
            【解决方案6】:

            你必须使用

            Directory.GetFiles(targetDirectory);
            

            就像在This sample 中一样,它包含您正在寻找的完整实现

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2012-11-30
              • 1970-01-01
              • 1970-01-01
              • 2013-06-25
              • 2014-03-26
              • 2011-05-05
              • 1970-01-01
              相关资源
              最近更新 更多