2012-12-11 50 views
5

我想知道掃描具有不確定字符的目錄的好方法是什麼。如何使用特定子目錄的通配符掃描目錄

例如,我想掃描

C:\程序\版本2 * \文件

含義

  • 該文件夾位於C:\Program
  • Version2.*可以是任何類似Version2.33Version2.1
  • 該文件夾中有一個名爲Files文件夾中它

我知道我可以做類似foreach (directory) if contains("Version2."),但我想知道是否有這樣做的更好的方法。

+0

您是否嘗試過[Directory.GetFiles功能(http://msdn.microsoft.com/en-us/library/wz42302f.aspx)?我不確定是否會包含多個目錄,但是它具有'*'作爲通配符 – Default

+0

可能的重複:http://stackoverflow.com/questions/7286477/possible-to-specify-directory-path-with-a-通配符 – Default

+0

@默認情況下,當通配符位於路徑的末尾時,該答案很有用,而不是中間的,似乎是在這個問題中。 –

回答

6

Directory.EnumerateDirectories接受搜索模式。所以枚舉具有通配符家長和比枚舉休息:

var directories = 
    Directory.EnumerateDirectories(@"C:\Program\", "Version2.*") 
    .SelectMany(parent => Directory.EnumerateDirectories(parent,"Files")) 

注:如果路徑可以包含在任何級別的通配符 - 只需正常化路徑,並通過「\」拆,不是由一級收集文件夾級別。

+0

是否有一個使用EnumerateDirectories而不是GetDirectories的原因? – Default

+2

@Default EnumerateDirectories使用延遲評估,因此對於大量文件/文件夾可能會更快(MSDN [鏈接]的檢查備註部分(http://msdn.microsoft.com/en-us/library/dd383572(v = vs .100).aspx)) –

+0

這似乎最適合我目前正在尋找的(: 我會盡快試一試,謝謝! –

1

試試這個

var pattern = new Regex(@"C:\\Program\\Version 2(.*)\\Files(.*)"); 

var directories = Directory.EnumerateDirectories(@"C:\Program", "*", 
               SearchOption.AllDirectories) 
               .Where(d => pattern.IsMatch(d)); 
+0

+1。可以工作,但可能會找到更多的直接方法 - 將需要額外的稍後過濾 –

+0

你說得對,當然我的答案中添加了過濾 –