전화번호부에 전화해 주시겠습니까?필터가 여러 개인 파일()을 가져오시겠습니까?
는 사하려합니다고를 사용하려고 .Directory.GetFiles()
과 같은 유형의 :mp3
의 모래jpg
두 를 모두 다음 두 가지를 모두 시도했지만 실패했습니다.
Directory.GetFiles("C:\\path", "*.mp3|*.jpg", SearchOption.AllDirectories);
Directory.GetFiles("C:\\path", "*.mp3;*.jpg", SearchOption.AllDirectories);
이것을 한 번의 통화로 할 수 있는 방법이 있습니까?
.NET 4.0 이상의 경우
var files = Directory.EnumerateFiles("C:\\path", "*.*", SearchOption.AllDirectories)
.Where(s => s.EndsWith(".mp3") || s.EndsWith(".jpg"));
의 이전 버전의 경우.그물,
var files = Directory.GetFiles("C:\\path", "*.*", SearchOption.AllDirectories)
.Where(s => s.EndsWith(".mp3") || s.EndsWith(".jpg"));
편집: 댓글 좀 읽어주세요.폴 패리가 제안한 개선점과 크리스찬이 제시한 기억력/성능 문제.K는 둘 다 매우 중요하다고 지적합니다.
이거 어때:
private static string[] GetFiles(string sourceFolder, string filters, System.IO.SearchOption searchOption)
{
return filters.Split('|').SelectMany(filter => System.IO.Directory.GetFiles(sourceFolder, filter, searchOption)).ToArray();
}
여기서 찾았어요 (댓글에서): http://msdn.microsoft.com/en-us/library/wz42302f.aspx
확인할 확장자 목록이 많은 경우 다음을 사용할 수 있습니다.나는 많은 OR 문을 만들고 싶지 않아서 레트가 쓴 것을 수정했습니다.
string supportedExtensions = "*.jpg,*.gif,*.png,*.bmp,*.jpe,*.jpeg,*.wmf,*.emf,*.xbm,*.ico,*.eps,*.tif,*.tiff,*.g01,*.g02,*.g03,*.g04,*.g05,*.g06,*.g07,*.g08";
foreach (string imageFile in Directory.GetFiles(_tempDirectory, "*.*", SearchOption.AllDirectories).Where(s => supportedExtensions.Contains(Path.GetExtension(s).ToLower())))
{
//do work here
}
위해서
var exts = new[] { "mp3", "jpg" };
할 수 있는 일:
public IEnumerable<string> FilterFiles(string path, params string[] exts) {
return
Directory
.EnumerateFiles(path, "*.*")
.Where(file => exts.Any(x => file.EndsWith(x, StringComparison.OrdinalIgnoreCase)));
}
- 새로운 것을 잊지 마세요.NET4
Directory.EnumerateFiles
성능 향상을 위해 (디렉토리의 차이점은 무엇입니까?Enumerate Files vs. Directory.파일 가져오기?) - Case"는 "Ignore Case")보다.
.EndsWith("aspx", StringComparison.OrdinalIgnoreCase)
.ToLower().EndsWith("aspx")
)
지만진정이은의 EnumerateFiles
필터를 분할하고 결과를 병합하면 다음과 같이 표시됩니다.
public IEnumerable<string> FilterFiles(string path, params string[] exts) {
return
exts.Select(x => "*." + x) // turn into globs
.SelectMany(x =>
Directory.EnumerateFiles(path, x)
);
}
만약 당신이 그것들을 글러브로 바꿀 필요가 없다면, 그것은 약간 더 빨라집니다.exts = new[] {"*.mp3", "*.jpg"}
이미).
으로 한 참고: "LinqPad 테스트Perf
딜러를 10000회 반복) https://gist.github.com/zaus/7454021
( 해당 질문이 LINQ: 다중 파일 확장명 검색 패턴 for System을 특별히 요청하지 않았기 때문에 '복제'에서 다시 게시 및 확장되었습니다.IO.디렉토리.파일 가져오기 )
오래된 질문인 건 알지만 LINQ: (.NET40+
var files = Directory.GetFiles("path_to_files").Where(file => Regex.IsMatch(file, @"^.+\.(wav|mp3|txt)$"));
메모리나 성능 오버헤드가 전혀 없는 것처럼 보이는 하강 솔루션도 있습니다.
string[] filters = new[]{"*.jpg", "*.png", "*.gif"};
string[] filePaths = filters.SelectMany(f => Directory.GetFiles(basePath, f)).ToArray();
Linq를 사용하는 또 다른 방법이지만, 모든 것을 반환하고 메모리에서 필터링할 필요는 없습니다.
var files = Directory.GetFiles("C:\\path", "*.mp3", SearchOption.AllDirectories).Union(Directory.GetFiles("C:\\path", "*.jpg", SearchOption.AllDirectories));
사실은 두 통의 전화입니다.GetFiles()
하지만 저는 그것이 질문의 정신과 일치하고 그것들을 하나의 열거형으로 반환한다고 생각합니다.
허락하다
var set = new HashSet<string>(
new[] { ".mp3", ".jpg" },
StringComparer.OrdinalIgnoreCase); // ignore case
var dir = new DirectoryInfo(path);
그리고나서
dir.EnumerateFiles("*.*", SearchOption.AllDirectories)
.Where(f => set.Contains(f.Extension));
또는
from file in dir.EnumerateFiles("*.*", SearchOption.AllDirectories)
from ext in set // makes sense only if it's just IEnumerable<string> or similar
where String.Equals(ext, file.Extension, StringComparison.OrdinalIgnoreCase)
select file;
아니요. 다음을 시도해 보세요.
List<string> _searchPatternList = new List<string>();
...
List<string> fileList = new List<string>();
foreach ( string ext in _searchPatternList )
{
foreach ( string subFile in Directory.GetFiles( folderName, ext )
{
fileList.Add( subFile );
}
}
// Sort alpabetically
fileList.Sort();
// Add files to the file browser control
foreach ( string fileName in fileList )
{
...;
}
출처: http://blogs.msdn.com/markda/archive/2006/04/20/580075.aspx
사용할 수 없습니다..Where
내가 프로그래밍하고 있기 때문에 메소드.NET Framework 2.0(Linq는 에서만 지원됩니다.NET Framework 3.5+).
아래 코드는 대소문자를 구분하지 않습니다(따라서)..CaB
또는.cab
목록에도 표시됩니다.)
string[] ext = new string[2] { "*.CAB", "*.MSU" };
foreach (string found in ext)
{
string[] extracted = Directory.GetFiles("C:\\test", found, System.IO.SearchOption.AllDirectories);
foreach (string file in extracted)
{
Console.WriteLine(file);
}
}
List<string> FileList = new List<string>();
DirectoryInfo di = new DirectoryInfo("C:\\DirName");
IEnumerable<FileInfo> fileList = di.GetFiles("*.*");
//Create the query
IEnumerable<FileInfo> fileQuery = from file in fileList
where (file.Extension.ToLower() == ".jpg" || file.Extension.ToLower() == ".png")
orderby file.LastWriteTime
select file;
foreach (System.IO.FileInfo fi in fileQuery)
{
fi.Attributes = FileAttributes.Normal;
FileList.Add(fi.FullName);
}
.NET 2.0(Linq 없음):
public static List<string> GetFilez(string path, System.IO.SearchOption opt, params string[] patterns)
{
List<string> filez = new List<string>();
foreach (string pattern in patterns)
{
filez.AddRange(
System.IO.Directory.GetFiles(path, pattern, opt)
);
}
// filez.Sort(); // Optional
return filez; // Optional: .ToArray()
}
그런 다음 사용:
foreach (string fn in GetFilez(path
, System.IO.SearchOption.AllDirectories
, "*.xml", "*.xml.rels", "*.rels"))
{}
DirectoryInfo directory = new DirectoryInfo(Server.MapPath("~/Contents/"));
//Using Union
FileInfo[] files = directory.GetFiles("*.xlsx")
.Union(directory
.GetFiles("*.csv"))
.ToArray();
VB를 사용하는 경우.NET(또는 종속성을 C# 프로젝트로 가져온 경우)에는 실제로 여러 확장을 필터링할 수 있는 편리한 방법이 있습니다.
Microsoft.VisualBasic.FileIO.FileSystem.GetFiles("C:\\path", Microsoft.VisualBasic.FileIO.SearchOption.SearchAllSubDirectories, new string[] {"*.mp3", "*.jpg"});
VB.NET에서 내 이름 공간을 통해 액세스할 수 있습니다.
My.Computer.FileSystem.GetFiles("C:\path", FileIO.SearchOption.SearchAllSubDirectories, {"*.mp3", "*.jpg"})
불하게도, ▁▁variant▁다▁donily않▁a니▁evaluated습▁these▁conven▁laz▁methods,ience도지ately,지하원▁supportt'게불변행과 같이 게으르게 평가된 변형을 지원하지 않습니다.Directory.EnumerateFiles()
그렇습니다.
다음 함수는 쉼표로 구분된 여러 패턴을 검색합니다.제외 항목을 지정할 수도 있습니다. 예를 들어 "!web.config"는 모든 파일을 검색하고 "web.config"를 제외합니다.패턴은 혼합할 수 있습니다.
private string[] FindFiles(string directory, string filters, SearchOption searchOption)
{
if (!Directory.Exists(directory)) return new string[] { };
var include = (from filter in filters.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries) where !string.IsNullOrEmpty(filter.Trim()) select filter.Trim());
var exclude = (from filter in include where filter.Contains(@"!") select filter);
include = include.Except(exclude);
if (include.Count() == 0) include = new string[] { "*" };
var rxfilters = from filter in exclude select string.Format("^{0}$", filter.Replace("!", "").Replace(".", @"\.").Replace("*", ".*").Replace("?", "."));
Regex regex = new Regex(string.Join("|", rxfilters.ToArray()));
List<Thread> workers = new List<Thread>();
List<string> files = new List<string>();
foreach (string filter in include)
{
Thread worker = new Thread(
new ThreadStart(
delegate
{
string[] allfiles = Directory.GetFiles(directory, filter, searchOption);
if (exclude.Count() > 0)
{
lock (files)
files.AddRange(allfiles.Where(p => !regex.Match(p).Success));
}
else
{
lock (files)
files.AddRange(allfiles);
}
}
));
workers.Add(worker);
worker.Start();
}
foreach (Thread worker in workers)
{
worker.Join();
}
return files.ToArray();
}
용도:
foreach (string file in FindFiles(@"D:\628.2.11", @"!*.config, !*.js", SearchOption.AllDirectories))
{
Console.WriteLine(file);
}
어때
string[] filesPNG = Directory.GetFiles(path, "*.png");
string[] filesJPG = Directory.GetFiles(path, "*.jpg");
string[] filesJPEG = Directory.GetFiles(path, "*.jpeg");
int totalArraySizeAll = filesPNG.Length + filesJPG.Length + filesJPEG.Length;
List<string> filesAll = new List<string>(totalArraySizeAll);
filesAll.AddRange(filesPNG);
filesAll.AddRange(filesJPG);
filesAll.AddRange(filesJPEG);
다른 방법을 찾았어요여전히 하나의 수술이 아니라, 다른 사람들이 그것에 대해 어떻게 생각하는지 보기 위해 그것을 버리는 것입니다.
private void getFiles(string path)
{
foreach (string s in Array.FindAll(Directory.GetFiles(path, "*", SearchOption.AllDirectories), predicate_FileMatch))
{
Debug.Print(s);
}
}
private bool predicate_FileMatch(string fileName)
{
if (fileName.EndsWith(".mp3"))
return true;
if (fileName.EndsWith(".jpg"))
return true;
return false;
}
왜 이렇게 많은 "해결책"이 게시되어 있는지 궁금합니다.
GetFiles의 작동 방식에 대한 초보적인 이해가 맞다면 두 가지 옵션만 있을 뿐이며 위의 솔루션 중 하나를 다음과 같이 요약할 수 있습니다.
파일을 가져온 다음 필터링:빠르지만 필터가 적용될 때까지 오버헤드를 저장하기 때문에 메모리 킬러입니다.
[파일 가져오기 중 필터링]: 느리게 설정할수록 더 많은 필터가 설정되지만 오버헤드가 저장되지 않으므로 메모리 사용량이 적습니다.
이것은 인상적인 벤치마크와 함께 위의 게시물 중 하나에 설명되어 있습니다. 각 필터 옵션은 별도의 GetFile-작업을 유발하여 하드 드라이브의 동일한 부분을 여러 번 읽습니다.
옵션 1)이 더 좋지만 검색 옵션을 사용하는 것이 좋습니다.C:\와 같은 폴더의 모든 디렉터리는 엄청난 양의 메모리를 사용합니다.
1을 하여 모든 폴더를 입니다.
이렇게 하면 각 폴더에서 GetFiles-operation이 1개만 발생하므로 속도가 빨라집니다(Option 1). 그러나 각 하위 폴더의 reading -> 오버헤드가 각 하위 폴더 뒤에 삭제된 후 필터가 적용되므로 소량의 메모리만 사용합니다.
제가 틀렸다면 고쳐주세요.저는 프로그래밍에 대해 꽤 새로 말했지만 결국 이것을 잘하기 위해 사물에 대한 더 깊은 이해를 얻고 싶습니다 :)
다음은 필터링된 파일을 가져오는 간단하고 우아한 방법입니다.
var allowedFileExtensions = ".csv,.txt";
var files = Directory.EnumerateFiles(@"C:\MyFolder", "*.*", SearchOption.TopDirectoryOnly)
.Where(s => allowedFileExtensions.IndexOf(Path.GetExtension(s)) > -1).ToArray();
원하는 확장자를 하나의 문자열(예: ".mp3.jpg.wma.wmf")로 만든 다음 각 파일에 원하는 확장자가 포함되어 있는지 확인합니다.LINQ를 사용하지 않기 때문에 .net 2.0과 함께 작동합니다.
string myExtensions=".jpg.mp3";
string[] files=System.IO.Directory.GetFiles("C:\myfolder");
foreach(string file in files)
{
if(myExtensions.ToLower().contains(System.IO.Path.GetExtension(s).ToLower()))
{
//this file has passed, do something with this file
}
}
이 접근 방식의 장점은 코드를 편집하지 않고 확장을 추가하거나 제거할 수 있다는 것입니다. 즉, png 이미지를 추가하려면 myExtensions=.jpg.mp3.png을 작성하기만 하면 됩니다.
/// <summary>
/// Returns the names of files in a specified directories that match the specified patterns using LINQ
/// </summary>
/// <param name="srcDirs">The directories to seach</param>
/// <param name="searchPatterns">the list of search patterns</param>
/// <param name="searchOption"></param>
/// <returns>The list of files that match the specified pattern</returns>
public static string[] GetFilesUsingLINQ(string[] srcDirs,
string[] searchPatterns,
SearchOption searchOption = SearchOption.AllDirectories)
{
var r = from dir in srcDirs
from searchPattern in searchPatterns
from f in Directory.GetFiles(dir, searchPattern, searchOption)
select f;
return r.ToArray();
}
아니요... 원하는 파일 형식만큼 전화를 걸어야 할 것 같습니다.
저는 제가 필요한 확장자를 가진 문자열의 배열을 사용하여 함수를 만들고 필요한 모든 호출을 해당 배열에서 반복합니다.이 함수는 내가 보낸 확장자와 일치하는 일반 파일 목록을 반환합니다.
도움이 되길 바랍니다.
저도 같은 문제가 있었고 올바른 솔루션을 찾을 수 없어서 GetFiles:라는 기능을 작성했습니다.
/// <summary>
/// Get all files with a specific extension
/// </summary>
/// <param name="extensionsToCompare">string list of all the extensions</param>
/// <param name="Location">string of the location</param>
/// <returns>array of all the files with the specific extensions</returns>
public string[] GetFiles(List<string> extensionsToCompare, string Location)
{
List<string> files = new List<string>();
foreach (string file in Directory.GetFiles(Location))
{
if (extensionsToCompare.Contains(file.Substring(file.IndexOf('.')+1).ToLower())) files.Add(file);
}
files.Sort();
return files.ToArray();
}
이 함수는 다음을 호출합니다.Directory.Getfiles()
단 한 번
예를 들어 다음과 같이 함수를 호출합니다.
string[] images = GetFiles(new List<string>{"jpg", "png", "gif"}, "imageFolder");
편집: 여러 확장명을 가진 하나의 파일을 가져오려면 다음 파일을 사용합니다.
/// <summary>
/// Get the file with a specific name and extension
/// </summary>
/// <param name="filename">the name of the file to find</param>
/// <param name="extensionsToCompare">string list of all the extensions</param>
/// <param name="Location">string of the location</param>
/// <returns>file with the requested filename</returns>
public string GetFile( string filename, List<string> extensionsToCompare, string Location)
{
foreach (string file in Directory.GetFiles(Location))
{
if (extensionsToCompare.Contains(file.Substring(file.IndexOf('.') + 1).ToLower()) &&& file.Substring(Location.Length + 1, (file.IndexOf('.') - (Location.Length + 1))).ToLower() == filename)
return file;
}
return "";
}
예를 들어 다음과 같이 함수를 호출합니다.
string image = GetFile("imagename", new List<string>{"jpg", "png", "gif"}, "imageFolder");
확장자 필터링에 GetFiles 검색 패턴을 사용하는 것은 안전하지 않습니다!예를 들어 Test1.xls 및 Test2.xlsx 파일이 두 개 있는데 검색 패턴 *.xls를 사용하여 xls 파일을 필터링하려고 하지만 GetFiles에서 Test1.xls와 Test2.xls를 모두 반환합니다. 일부 임시 파일이 갑자기 올바른 파일로 처리되었을 때 운영 환경에서 오류가 발생했습니다.검색 패턴은 *.txt이고 임시 파일의 이름은 *.txt20181028_100753898입니다. 그래서 검색 패턴을 신뢰할 수 없으므로 파일 이름에 대한 추가 검사도 추가해야 합니다.
또는 확장자 문자열을 String^으로 변환할 수 있습니다.
vector <string> extensions = { "*.mp4", "*.avi", "*.flv" };
for (int i = 0; i < extensions.size(); ++i)
{
String^ ext = gcnew String(extensions[i].c_str());;
String^ path = "C:\\Users\\Eric\\Videos";
array<String^>^files = Directory::GetFiles(path,ext);
Console::WriteLine(ext);
cout << " " << (files->Length) << endl;
}
어떤 솔루션이 더 나은지 모르지만, 저는 이것을 사용합니다.
String[] ext = "*.ext1|*.ext2".Split('|');
List<String> files = new List<String>();
foreach (String tmp in ext)
{
files.AddRange(Directory.GetFiles(dir, tmp, SearchOption.AllDirectories));
}
프로젝트에 추가할 수 있습니다.
public static class Collectables {
public static List<System.IO.FileInfo> FilesViaPattern(this System.IO.DirectoryInfo fldr, string pattern) {
var filter = pattern.Split(" ");
return fldr.GetFiles( "*.*", System.IO.SearchOption.AllDirectories)
.Where(l => filter.Any(k => l.Name.EndsWith(k))).ToList();
}
}
그럼 이렇게 아무데나 쓰세요.
new System.IO.DirectoryInfo("c:\\test").FilesViaPattern("txt doc any.extension");
언급URL : https://stackoverflow.com/questions/163162/can-you-call-directory-getfiles-with-multiple-filters
'programing' 카테고리의 다른 글
SQL 선택 조인: 모든 열 앞에 '접두사'로 접두사를 지정할 수 있습니다.*'? (0) | 2023.05.16 |
---|---|
지정한 문자열로 시작하는 파일 이름을 가진 모든 파일을 찾으시겠습니까? (0) | 2023.05.16 |
postgres를 사용하여 string_agg와 같이 array_agg의 null 값을 제외하는 방법은 무엇입니까? (0) | 2023.05.16 |
Windows에서 MongoDB에 연결하는 방법은 무엇입니까? (0) | 2023.05.11 |
리눅스에서 Grep이 있는 DOS 줄 끝(CRLF)이 포함된 파일을 어떻게 검색합니까? (0) | 2023.05.11 |