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小时