[C#] 여러 파일 확장자 searchPattern for System.IO.Directory.GetFiles

여러 파일 확장자를 다음 과 같이 설정하는 구문은 무엇입니까searchPattern 에가 Directory.GetFiles()? 예를 들어 확장자 가 .aspx.ascx 인 파일을 필터링합니다 .

// TODO: Set the string 'searchPattern' to only get files with
// the extension '.aspx' and '.ascx'.
var filteredFiles = Directory.GetFiles(path, searchPattern);

최신 정보 : LINQ는 옵션이 아니며 질문에 지정된대로 searchPattern전달 되어야합니다 GetFiles.



답변

“즉시 사용 가능한”솔루션이 없다고 생각합니다. 이는 Directory.GetFiles 메서드의 제한 사항입니다.

그래도 자신의 방법을 작성하는 것은 매우 쉽습니다 . 여기에 예가 있습니다.

코드는 다음과 같습니다.

/// <summary>
/// Returns file names from given folder that comply to given filters
/// </summary>
/// <param name="SourceFolder">Folder with files to retrieve</param>
/// <param name="Filter">Multiple file filters separated by | character</param>
/// <param name="searchOption">File.IO.SearchOption, 
/// could be AllDirectories or TopDirectoryOnly</param>
/// <returns>Array of FileInfo objects that presents collection of file names that 
/// meet given filter</returns>
public string[] getFiles(string SourceFolder, string Filter,
 System.IO.SearchOption searchOption)
{
 // ArrayList will hold all file names
ArrayList alFiles = new ArrayList();

 // Create an array of filter string
 string[] MultipleFilters = Filter.Split('|');

 // for each filter find mathing file names
 foreach (string FileFilter in MultipleFilters)
 {
  // add found file names to array list
  alFiles.AddRange(Directory.GetFiles(SourceFolder, FileFilter, searchOption));
 }

 // returns string array of relevant file names
 return (string[])alFiles.ToArray(typeof(string));
}

답변

var filteredFiles = Directory
    .GetFiles(path, "*.*")
    .Where(file => file.ToLower().EndsWith("aspx") || file.ToLower().EndsWith("ascx"))
    .ToList();

2014-07-23 편집

빠른 열거를 위해 .NET 4.5에서이 작업을 수행 할 수 있습니다.

var filteredFiles = Directory
    .EnumerateFiles(path) //<--- .NET 4.5
    .Where(file => file.ToLower().EndsWith("aspx") || file.ToLower().EndsWith("ascx"))
    .ToList();

MSDN의 Directory.EnumerateFiles


답변

GetFiles는 단일 패턴과 만 일치 할 수 있지만 Linq를 사용하여 여러 패턴으로 GetFiles를 호출 할 수 있습니다.

FileInfo[] fi = new string[]{"*.txt","*.doc"}
    .SelectMany(i => di.GetFiles(i, SearchOption.AllDirectories))
    .ToArray();

여기에 의견 섹션을 참조하십시오 :
http://www.codeproject.com/KB/aspnet/NET_DirectoryInfo.aspx


답변

읽을 수 있고 디렉토리의 여러 반복을 피하기 때문에이 방법을 좋아합니다.

var allowedExtensions = new [] {".doc", ".docx", ".pdf", ".ppt", ".pptx", ".xls", ".xslx"};
var files = Directory
    .GetFiles(folder)
    .Where(file => allowedExtensions.Any(file.ToLower().EndsWith))
    .ToList();


답변

나는 당신이 이와 같은 일을해야 할 것을 두려워합니다 . 여기 에서 정규 표현식을 변경 했습니다 .

var searchPattern = new Regex(
    @"$(?<=\.(aspx|ascx))",
    RegexOptions.IgnoreCase);
var files = Directory.EnumerateFiles(path)
    .Where(f => searchPattern.IsMatch(f))
    .ToList();


답변

var filteredFiles = Directory
    .EnumerateFiles(path, "*.*") // .NET4 better than `GetFiles`
    .Where(
        // ignorecase faster than tolower...
        file => file.ToLower().EndsWith("aspx")
        || file.EndsWith("ascx", StringComparison.OrdinalIgnoreCase))
    .ToList();

또는 글로브를 분할하고 병합하는 것이 더 빠를 수 있습니다 (적어도 깔끔해 보입니다).

"*.ext1;*.ext2".Split(';')
    .SelectMany(g => Directory.EnumerateFiles(path, g))
    .ToList();


답변

기억하기 쉽고 게으른 아마도 불완전한 해결책 :

Directory.GetFiles(dir, "*.dll").Union(Directory.GetFiles(dir, "*.exe"))