C#使用Directory.GetFiles和搜索模式递归目录

我想使用递归在目录结构中找到所有excel文件。 问题是,Directory.GetFiles中使用的搜索模式一次只允许一个扩展。

有没有人知道解决这个问题的方法,还是我必须多次通过目录来寻找特定的扩展? 或者你可以只抓取每个文件,然后遍历该列表寻找特定的扩展名。 无论哪种方式听起来都有点低效。

谢谢

在.NET中,每个版本都有SearchOption.TopDirectoryOnly和SearchOption.AllDirectories

在.NET 4中,您可以非常高效地执行以下操作:

var regex = new Regex(@"\d+", RegexOptions.Compiled); var files = new DirectoryInfo(topdir) .EnumerateFiles("*.*", SearchOption.AllDirectories) .Where(fi => regex.IsMatch(fi.Name)); 

(此示例过滤名称中包含两位数的文件)

要模拟这个,编写一个递归的枚举器方法(yield return)来返回所有文件,并像这样过滤结果:

  IEnumerable Recurse(string topdir) { // for each GetFiles() array element // if is_not_dir yield return // else Recurse(subdir) } var filtered = Recurse.Where(fi => regex.IsMatch(fi.Name)); 

HTH

修改递归循环并获得模式列表。 例如

 static private void walk(String name) { try { foreach (String pattern in Patterns) { foreach (String f in Directory.GetFiles(name, pattern)) { Console.WriteLine(f); } } foreach (String d in Directory.GetDirectories(name)) { walk(d); } } catch { } 

}

在.NET 4中,有一个额外的重载,允许包含子文件夹

编辑 oops我没有很好地阅读这个问题……

看看这里

如果您只想获取所有excel文件,请使用“ .xl ”模式。

否则我建议不使用模式调用Directory.GetFiles并手动过滤匹配的扩展名。

要遍历目录和子目录,无论子文件夹或文件有多少,您可以将文件放入数组中。 您可以在扩展部分中指定所需的类型文件,Jpeg,Excel,Msword。

 string [] Excel_Files; String path = "what ever is your path"; Files= Directory.GetFiles(Path, "*.XL", SearchOption.AllDirectories).Select(x => Path.GetFileName(x)).ToArray(); 

或者要为不同的文件扩展名指定多个搜索选项,您可以这样做:

 public string[] getFiles(string SourceFolder, string Filter, System.IO.SearchOption searchOption) { ArrayList alFiles = new ArrayList(); string[] MultipleFilters = Filter.Split('|'); foreach (string FileFilter in MultipleFilters) { alFiles.AddRange(Directory.GetFiles(SourceFolder, FileFilter, searchOption)); } return (string[])alFiles.ToArray(typeof(string)); } public void button_click() { string[] sFiles = getFiles(Server.MapPath("~/"), "*.gif|*.jpg|*.png|*.bmp|*.XL|*.PNG", SearchOption.AllDirectories); foreach (string FileName in sFiles) { Response.Write(FileName + "
"); } }

我认为第二种选择更有效。 使用以下模式遍历每个文件: .xl ,然后缩小列表以查找特定结尾。

就像是:

 foreach (String f in Directory.GetFiles(path, "*.xl*", SearchOption.AllDirectories)) { if (HasSomeExcelExtension(f)) files .Add(f); } 

您可以使用EndsWith方法检查每个扩展名的“f”,或使用Path.GetExtension方法提取扩展名,并在包含所需扩展名的哈希表中查找。

只是我的$ .02小时