2016-08-04 133 views
0

假設以下目錄結構。 「C:\ Genre」和「Genre」目錄有幾個子目錄:「Rock」,「Pop」,「Metal」,「Jazz」。Directory.EnumerateFiles方法:如何枚舉指定子目錄中的文件?

我該如何調整以下語句才能在「Rock」和「Metal」子目錄中搜索?

var myFiles = Directory. 
    EnumerateFiles("C:\Genre", "*", SearchOption.AllDirectories). 
    Where(s => s.EndsWith(".jpg") || s.EndsWith(".gif")); 
+0

在C搜索:\流派\岩石和C:\類型\金屬和合並結果?雖然我不確定gifs && jpgs會不會用於音樂;) – Icepickle

+3

@Icepickle也許OP正在尋找專輯封面和/或封面! :-) –

+0

由於搜索模式不允許使用正則表達式或任何其他花哨的東西,所以您只需進行2次搜索或者有一個where條件,如'(s =>(s.ToLower()。Contains(「rock 「)|| s.ToLower()。Contains(」metal「))&&(s.EndsWith(」。jpg「)|| s.EndsWith(」.gif「))'。 – Adwaenyth

回答

1

請考慮這樣一個有些實施:

public static class Program 
{ 
    public static void Main() 
    { 
     var directoryPaths = new List<string> 
      { 
       @"C:\root\path_1", 
       @"C:\root\path_2", 
       @"C:\root\path_3" 
       // … 
      }; 
     var searchPatterns = new List<string> 
      { 
       "*.jpg", 
       "*.gif" 
      }; 

     var filePaths = directoryPaths 
      .SelectMany(directoryPath => 
       EnumerateFiles(directoryPath, searchPatterns, SearchOption.AllDirectories)) 
      .ToList() 
      .AsReadOnly(); 

     // … 
    } 

    private static IEnumerable<string> EnumerateFiles(
     string path, 
     IEnumerable<string> searchPatterns, 
     SearchOption searchOption) 
    { 
     var filePaths = searchPatterns.SelectMany(
      searchPattern => Directory.EnumerateFiles(path, searchPattern, searchOption)); 
     return filePaths; 
    } 
} 
+0

太棒了!我非常喜歡這個解決方案......我分別調整了我的項目。但是,我看到一個filePaths計數爲0. – 80sRocker

+0

@ 80sRocker,對不起,那是我的錯誤。請參閱更新。 –

+1

謝謝大家的意見!我喜歡這個解決方案。但是,如果我在處理10萬個文件等時遇到任何性能問題,我很好奇嗎?謝謝! – 80sRocker

1

在Linq中使用Concat來合併兩個目錄中的文件。

var rockFiles = Directory. 
EnumerateFiles("C:\Genre\Rock", "*", SearchOption.AllDirectories); 
var metalFiles = Directory. 
EnumerateFiles("C:\Genre\Metal", "*", SearchOption.AllDirectories); 

var myFiles = rockFile 
.Concat(metalFiles) 
.Where(s => s.EndsWith(".jpg") || s.EndsWith(".gif")); 
+1

由於您保證兩個枚舉之間不會有任何重複,您應該使用Concat而不是Union,並避免重複搜索。 –

+0

是的,你說得對。我只是想不起「Concat」這個名字。 – jetstream96

0

你可以使用的擴展和Path -class兩個數組:

var myFiles = Directory.EnumerateFiles(@"C:\Temp\Genre", "*", SearchOption.AllDirectories) 
    .Where(fn => genres.Contains(Path.GetFileName(Path.GetDirectoryName(fn)), StringComparer.InvariantCultureIgnoreCase) 
      && extensions.Contains(Path.GetExtension(fn), StringComparer.InvariantCultureIgnoreCase)); 

Path.GetFileName(Path.GetDirectoryName(fn))返回文件路徑的文件夾名稱。

2

我想說的清潔方法是搜索你想要的每個目錄下,然後在myFiles

var rockFiles = Directory.EnumerateFiles("c:\Genre\Rock", "*", SearchOption.AllDirectories).Where(s => s.EndsWith(".jpg") || s.EndsWith(".gif")); 
var metalFiles = Directory.EnumerateFiles("c:\Genre\Metal", "*", SearchOption.AllDirectories).Where(s => s.EndsWith(".jpg") || s.EndsWith(".gif")); 
var myFiles = RockFiles.Concat(MetalFiles); 

把它們加起來現在,如果你想有一個通用的方法來做到這一點,那將是一個不同的故事,複雜一點的:)

相關問題