[英]C# Recurse Directories using Directory.GetFiles and search pattern
我想使用遞歸在目錄結構中找到所有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<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
修改遞歸循環並獲得模式列表。 例如
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
{
}
}
如果您只想獲取所有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 + "<br />");
}
}
我認為第二種選擇更有效率。 使用以下模式遍歷每個文件: .xl ,然后縮小列表以查找特定結尾。
就像是:
foreach (String f in Directory.GetFiles(path, "*.xl*", SearchOption.AllDirectories))
{
if (HasSomeExcelExtension(f))
files .Add(f);
}
您可以使用EndsWith方法檢查每個擴展名的“f”,或使用Path.GetExtension方法提取擴展名,並在包含所需擴展名的哈希表中查找。
只是我的$ .02小時
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.