2013-03-06 16 views
1

我想從多個文件夾中獲取.mp3文件。LINQ嵌套列表理解從幾個文件夾中獲取文件

我已經可以做到這一點對一個文件夾,通過這個查詢:

this.MusicList.ItemsSource = 
       from string fileName in Directory.GetFiles(@"C:\Users\Public\Music\Sample Music") 
       where System.IO.Path.GetExtension(fileName) == ".mp3" 
       select new FileInfo(fileName); 

是否有任何其他的方式做它的目錄列表?

這裏是我到目前爲止已經試過(不返回任何結果):

var paths = new Dictionary<string, string> { 
      {"default_music", @"C:\Users\Public\Music\Sample Music"}, 
      {"alternative_folder", @"C:\tmp"} 
      }; 

this.MusicList.ItemsSource = 
from string fileName in (from string directoryName in paths.Values select Directory.GetFiles(directoryName)) 
where System.IO.Path.GetExtension(fileName) == ".mp3" 
select new FileInfo(fileName); 

from string directoryName in paths.Values select Directory.GetFiles(directoryName);返回與我的路徑{System.Linq.Enumerable.WhereSelectEnumerableIterator<string,string[]>}在其source場及其Result View包含我.mp3文件。

謝謝

回答

6

請嘗試以下

this.MusicList.ItemsSource = 
    from path in paths 
    from fileName in Directory.GetFiles(path) 
    where System.IO.Path.GetExtension(fileName) == ".mp3" 
    select new FileInfo(fileName); 

嚴格的方法調用版本

this.MusicList.ItemSource = paths 
    .SelectMany(path => Directory.GetFiles(path)) 
    .Where(fileName => System.IO.Path.GetExtension(fileName) == ".mp3") 
    .Select(fileName => new FileInfo(fileName)); 
+0

完美地工作。 (我會在10分鐘內接受) – rxdazn 2013-03-06 16:15:56

+1

'Directory.GetFiles'有一個超載,帶一個'searchPattern',你應該用它來過濾: 'Directory.GetFiles(@「C:\ Users \ Public \ Music \ Sample音樂「,」* .mp3「);' – 2013-03-06 16:17:28

0

替代的可貴JaredPar跟蹤如果它是一個文件/目錄:

var basePath = @"c:\temp"; 
var query = 
    from entry in Directory.EnumerateFileSystemEntries(basePath, "*.*", SearchOption.AllDirectories) 
    let isDirectory = Directory.Exists(entry) 
    let isFile = File.Exists(entry) 
    select new { isDirectory, isFile, entry}; 
query.Dump(); 

編輯:Doh-誤讀的問題,錯過了「從一組目錄」部分;我的恥辱是不可估量的。 :)

+0

路徑將從'FolderBrowserDialog'返回,所以我不需要檢查它。儘管感謝您的輸入。 – rxdazn 2013-03-06 16:23:35

+0

@rxdazn是的,我的錯;在我的手機上閱讀錯誤的問題。 – JerKimball 2013-03-06 16:24:56

1

試試這個

Directory.EnumerateFiles(@"C:\Users\Public\Music\Sample Music", "*.mp3", SearchOption.AllDirectories) 

返回.MP3的,您可以進一步過濾或枚舉等,這是比GetFiles()的大量文件和/或目錄的更有效的枚舉列表。

http://msdn.microsoft.com/en-us/library/dd383571.aspx

+0

簡潔的解決方案。 – 2013-03-06 16:47:08

3

您可以使用DirectoryInfo.EnumerateFiles方法,它接受搜索模式。因此,你並不需要得到所有文件,並通過調用過濾它們以Path.GetExtension

var paths = new Dictionary<string, string> { 
     {"default_music", @"C:\Users\Public\Music\Sample Music"}, 
     {"alternative_folder", @"C:\tmp"} 
    }; 

MusicList.ItemsSource = paths.Values.Select(p => new DirectoryInfo(p)) 
          .SelectMany(d => d.EnumerateFiles("*.mp3")); 

而且DirectoryInfo.EnumerateFiles回報FileInfo情況下,這也是你想要的。

相關問題