2013-04-26 2 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

다른 유형이 필요하다고 생각합니다. 여러 유형을 깔끔하게 처리하는 방법은 확실하지 않습니다.

답변

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(); 

또는 쿼리 구문 :

(210) 당신은 GetFiles() 기능을 사용하여이 작업을 수행 할 수 있습니다
0

너무

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

내 첫번째 생각은 세미콜론을 사용했지만, 그것은 작동하지 않았다 . 내가 제안한대로 파이프를 시도하고 "ArgumentException : 경로에 잘못된 문자가 있습니다. *" –

0

이 방법을 시도

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

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); 
     } 
    } 
관련 문제