2009-01-13 114 views
19

我需要搜索一个驱动器(C:,D:等)的特定文件类型(扩展名如.xml,.csv,.xls)。如何执行递归搜索以循环所有目录和内部目录,并返回文件所在的完整路径?或者我可以在哪里获得关于此的信息?递归文件搜索.net

VB.NET或C#

感谢

编辑〜我遇到像一些错误,无法访问系统卷访问被拒绝等有谁知道在哪里可以看到实现文件中的一些smaple代码搜索?我只需要搜索选定的驱动器并返回所有找到的文件的文件类型的完整路径。

回答

20

这个怎么样?它避免了内置的递归搜索经常抛出的异常(即,您访问被拒绝访问单个文件夹,并且您的整个搜索都会死亡),并且被懒惰地评估(即它一找到它们就返回结果,而不是缓冲2000结果)。懒惰的行为让你构建响应式用户界面等,并与LINQ(特别是First(),Take(),等)。

using System; 
using System.Collections; 
using System.Collections.Generic; 
using System.IO; 
static class Program { // formatted for vertical space 
    static void Main() { 
     foreach (string match in Search("c:\\", "*.xml")) { 
      Console.WriteLine(match); 
     } 
    } 
    static IEnumerable<string> Search(string root, string searchPattern) { 
     Queue<string> dirs = new Queue<string>(); 
     dirs.Enqueue(root); 
     while (dirs.Count > 0) { 
      string dir = dirs.Dequeue(); 

      // files 
      string[] paths = null; 
      try { 
       paths = Directory.GetFiles(dir, searchPattern); 
      } catch { } // swallow 

      if (paths != null && paths.Length > 0) { 
       foreach (string file in paths) { 
        yield return file; 
       } 
      } 

      // sub-directories 
      paths = null; 
      try { 
       paths = Directory.GetDirectories(dir); 
      } catch { } // swallow 

      if (paths != null && paths.Length > 0) { 
       foreach (string subDir in paths) { 
        dirs.Enqueue(subDir); 
       } 
      } 
     } 
    } 
} 
+0

嗯...刚刚得到了一个downvote出蓝色 - 照顾解释为什么? – 2009-10-02 15:36:34

52
System.IO.Directory.GetFiles(@"c:\", "*.xml", SearchOption.AllDirectories); 
+0

正是我想要的。简单而有效。 – NMunro 2013-07-03 18:39:15

5

它看起来像recls库 - 代表REC ursive LS - 现在有一个pure .NET implementation。我只是read about it in Dr Dobb's

将用作:

using Recls; 
using System; 
static class Program { // formatted for vertical space 
    static void Main() { 
     foreach(IEntry e in FileSearcher.Search(@"c:\", "*.xml|*.csv|*.xls")) { 
      Console.WriteLine(e.Path); 
     } 
    }