2013-04-26 152 views
1

我想基於特定文件擴展名從文件夾返回文件列表。基於多個選項篩選列表

此刻,我得到所有文件。我如何過濾某些類型?

此刻,我的代碼看起來是這樣的:

public static List<FileInfo> BuildListOfFiles() 
{ 
    var d = new DirectoryInfo(Constants.FolderToMonitor); 
    if (d.Exists) 
    { 
     var files = (from file in d.EnumerateFiles() select file).ToList(); 
     return files; 
    } 
    return null; 

} 

但我只想

* .MP4,* .MPG,* .AVI,*文件.mpeg

我想我需要另一個.Where,但不知道如何幹淨地處理多種類型。

回答

4

您可以使用LINQ做過濾:

var searchExtensions = new string[] { ".mp4", ".mpg", ".avi", ".mpeg" }; 
var files = d.EnumerateFiles() 
      .Where(f => searchExtensions.Contains(Path.GetExtension(file)) 
            .ToList(); 

或者在查詢語法:

var searchExtensions = new string[] { ".mp4", ".mpg", ".avi", ".mpeg" }; 
var files = 
    (from file in d.EnumerateFiles() 
    where searchExtensions.Contains(Path.GetExtension(file)) 
    select file) 
    .ToList(); 

另一種解決辦法是建立文件列表,而不是對其進行篩選:

var searchPatterns = new string[] { "*.mp4", "*.mpg", "*.avi", "*.mpeg" }; 
var files = searchPatterns.SelectMany(p => d.EnumerateFiles(p)) 
                .ToList(); 

或者在查詢語法中:

var searchPatterns = new string[] { "*.mp4", "*.mpg", "*.avi", "*.mpeg" }; 
var files = 
    (from pattern in searchPatterns 
    from file in d.EnumerateFiles(pattern)) 
    select file) 
    .ToList(); 
0

您可以通過使用GetFiles()功能做到這一點太

var files = d.GetFiles("*.mp4|*.mpg|*.avi|*.mpeg", SearchOptions.AllDirectories).ToList(); 
+0

我首先想到的是使用分號,但似乎並沒有工作。我嘗試管道,因爲你建議,並得到「* ArgumentException:路徑中的非法字符。*」 – 2013-04-26 05:00:08

0

試過這樣:

List<FileInfo> mediaFiles = new List<FileInfo>(); 

    foreach (string file in Directory.GetFiles(path)) 
    { 
     FileInfo matchFiles = new FileInfo(file); 

     if ((matchFiles.Extension == ".mp4") || (matchFiles.Extension == ".mpg") || (matchFiles.Extension == ".avi") || (matchFiles.Extension == ".mpeg")) 
     { 
      mediaFiles.Add(matchFiles); 
     } 
    }