2011-04-01 105 views
3

我想使用遞歸查找目錄結構中的所有excel文件。問題是,Directory.GetFiles中使用的搜索模式一次只允許一個擴展。C#遞歸目錄使用Directory.GetFiles和搜索模式

有沒有人知道解決此問題的方法,還是必須通過目錄多次尋找特定的擴展名?或者你可以抓住每一個文件,然後循環查找特定的擴展名。無論哪種方式聽起來有點低效。

感謝

+1

不過濾 「.xl *」 足夠好? – 2011-04-01 10:25:48

+1

你不能只用「\ *。xl \ *」作爲你的搜索模式嗎? – forsvarir 2011-04-01 10:26:04

回答

3

在.NET中每個版本有SearchOption .TopDirectoryOnly和SearchOption.AllDirectories

(對於具有名字兩位數字文件這個例子過濾器)

來模擬此,寫一個遞歸枚舉法

 var regex = new Regex(@"\d+", RegexOptions.Compiled); 

     var files = new DirectoryInfo(topdir) 

      .EnumerateFiles("*.*", SearchOption.AllDirectories) 

      .Where(fi => regex.IsMatch(fi.Name)); 

(:

在.NET 4中,你可以非常有效地做如產量返回)返回的所有文件,並篩選結果像這樣:

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

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 
    { 

    } 

}

+0

這幾乎是我在之前發佈的文章中提到的關於必須多次檢查每個文件夾,每次檢查每個特定擴展的一次。這是實現這一目標的唯一方法嗎?對我來說似乎效率低下。 – 2011-04-01 10:24:58

+0

我想,嗯,你有2個選擇,獲取所有文件的詳細信息,然後使用正則表達式測試自己,或者包含文件名匹配或多次掃描。我會進行一次時間比較,因爲它可能比您想象的要快得多。 – BugFinder 2011-04-01 10:29:37

0

如果您只想獲取所有的excel文件,請使用「.xl」的模式。

否則,我會建議打電話Directory.GetFiles沒有模式,並手工過濾匹配的擴展名。

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 />"); 
} 
} 
0

我認爲第二個選擇是更有效的。使用以下模式遍歷每個文件:.xl,然後縮小列表以尋找特定的結尾。

喜歡的東西:

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

你可以使用的endsWith方法來檢查「F」對每個分機,或使用Path.GetExtension方法提取的延伸和包含所需擴展看看它在哈希表。

只是我的$ .02 心連心