여러 파일 확장자를 다음 과 같이 설정하는 구문은 무엇입니까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();
답변
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();
Directory.EnumerateFiles
성능 향상을위한 새로운 .NET4 를 잊지 마십시오 ( Directory.EnumerateFiles와 Directory.GetFiles의 차이점은 무엇입니까? )- “IgnoreCase”는 “ToLower”보다 빠릅니다.
또는 글로브를 분할하고 병합하는 것이 더 빠를 수 있습니다 (적어도 깔끔해 보입니다).
"*.ext1;*.ext2".Split(';')
.SelectMany(g => Directory.EnumerateFiles(path, g))
.ToList();
답변
기억하기 쉽고 게으른 아마도 불완전한 해결책 :
Directory.GetFiles(dir, "*.dll").Union(Directory.GetFiles(dir, "*.exe"))