我想使用递归查找目录结构中的所有excel文件。问题是,Directory.GetFiles中使用的搜索模式一次只允许一个扩展。
有没有人知道解决这个问题的方法,还是我必须多次通过目录来寻找特定的扩展?或者你可以只抓取每个文件,然后遍历该列表寻找特定的扩展名。无论哪种方式听起来都有点低效。
由于
答案 0 :(得分:5)
在.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<FileInfo> 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
答案 1 :(得分:0)
修改递归循环并获得模式列表。例如
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
{
}
}
答案 2 :(得分:0)
In .NET 4 there is an extra overload that allows the inclusion of subfolders
编辑 oops我没有很好地阅读这个问题......
答案 3 :(得分:0)
如果您只想获取所有Excel文件,请使用“ .xl ”模式。
否则我建议不用模式调用Directory.GetFiles
并手动过滤匹配的扩展名。
答案 4 :(得分:0)
要遍历目录和子目录,无论子文件夹或文件有多少,您可以将文件放入数组中。 您可以在扩展部分中指定类型文件,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 + "<br />");
}
}
答案 5 :(得分:0)
我认为第二种选择更有效率。使用以下模式遍历每个文件: .xl ,然后缩小列表以查找特定结尾。
类似的东西:
foreach (String f in Directory.GetFiles(path, "*.xl*", SearchOption.AllDirectories))
{
if (HasSomeExcelExtension(f))
files .Add(f);
}
您可以使用EndsWith方法检查每个扩展名的“f”,或使用Path.GetExtension方法提取扩展名,并在包含所需扩展名的哈希表中查找。
只是我的$ .02 HTH