여러 필터를 사용하여 Directory.GetFiles ()를 호출 할 수 있습니까?


353

내가 사용하려고 Directory.GetFiles()같은 여러 유형의 파일 목록을 검색하는 방법을 mp3의와 jpg의를. 나는 운없이 다음 두 가지를 모두 시도했다.

Directory.GetFiles("C:\\path", "*.mp3|*.jpg", SearchOption.AllDirectories);
Directory.GetFiles("C:\\path", "*.mp3;*.jpg", SearchOption.AllDirectories);

한 번의 호출로이를 수행 할 수있는 방법이 있습니까?


3
참고로 확장 파일을 필터링하기 위해 GetFiles 검색 패턴을 사용하는 것은 안전하지 않습니다. 예를 들어 Test1.xls 및 Test2.xlsx 파일이 두 개이고 검색 패턴 * .xls를 사용하여 xls 파일을 필터링하려고하지만 GetFiles는 Test1을 모두 반환합니다 .xls 및 Test2.xlsx. 자세한 내용은 참고 섹션을 읽으십시오
kiran

어떻게 이것을 막을 수 있습니까?
브래킷

2
@kiran 어떻게 안전하지 않습니까? 그것은 버그가 아닌 기능처럼 보입니다.
Kyle Delaney 2016 년

답변:


519

.NET 4.0 이상의 경우

var files = Directory.EnumerateFiles("C:\\path", "*.*", SearchOption.AllDirectories)
            .Where(s => s.EndsWith(".mp3") || s.EndsWith(".jpg"));

이전 버전의 .NET의 경우

var files = Directory.GetFiles("C:\\path", "*.*", SearchOption.AllDirectories)
            .Where(s => s.EndsWith(".mp3") || s.EndsWith(".jpg"));

편집 : 의견을 읽으십시오. Paul Farry가 제안한 개선 과 Christian.K가 지적한 기억 / 성능 문제 는 매우 중요합니다.


10
LINQ 측면에서 더 자주 생각해야합니다. 좋은 해결책!
Ken Pespisa

61
그래도 의미를 이해해야합니다. 이렇게하면 모든 파일이 문자열 배열로 반환 된 다음 지정한 확장명으로 필터링됩니다. "C : \ Path"에 파일이 많지 않은 경우 큰 문제는 아니지만 "C : \"의 메모리 / 성능 문제 또는 이와 유사한 문제 일 수 있습니다.
Christian.K

24
... 2 년 후 : 좋은 코드이지만 이것으로 조심하십시오. .JPG로 끝나는 파일이 있으면 만들 수 없습니다. 더 나은 추가s.ToLower().Endswith...
Stormenet

107
당신은 그냥 사용할 수 있습니다s.EndsWith(".mp3", StringComparison.OrdinalIgnoreCase)
Paul Farry

119
.NET 4.0을 사용하면 바꿀 수 있습니다. Directory.GetFilesDirectory.EnumerateFiles, msdn.microsoft.com/en-us/library/dd383571.aspx Christian.K 언급 @하는 메모리 문제를 피할 것이다.
Jim Mischel

60

이건 어때요:

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


나는 이것이 최고 등급의 대답에서 잠재적 인 메모리 함정을 피한다고 추측하고 있습니까? 이 경우 더 높은 등급을 받아야합니다!
Dan W

11
@ DanWan 최고 등급의 답변은 반드시 메모리에 부담을 주지만 그렇게 문제가되지는 않는다고 생각합니다. 나는이 대답도 좋아했지만 실제로 받아 들인 대답보다 느리다. 이 SpeedTest
OttO를

감사. 그것은 단지 두 배 정도 느리다는 것을 알게되어 기쁘다. 나는 그 동안 내 생각에 충실 할 것이다.
Dan W

7
확장이 두 개만있는 경우 속도가 두 배만 느립니다. X 확장명 목록이 있으면 X 배 더 느립니다. 여기서는 Directory.GetFiles 함수를 여러 번 호출하기 때문에 다른 솔루션에서는 한 번만 호출됩니다.
Oscar Hermosilla

1
@OscarHermosilla 하나는 Parallel.ForEach병렬로 사용할 수 있습니다
FindOutIslamNow

33

확인할 확장명 목록이 많은 경우 다음을 사용할 수 있습니다. 나는 많은 OR 문을 만들고 싶지 않아서 lette가 쓴 것을 수정했습니다.

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
}

이것을 도와주세요 ... imageFile을 인쇄 할 때 전체 경로를 제공합니다. 파일 이름으로 축소하는 방법은 무엇입니까?
Naresh

1
System.IO.Path.GetFileName (imageFile)
jnoreiga

Path.GetExtension'* .ext'가 아닌 '.ext'를 반환합니다 (최소한 3.5+ 이상).
nullable

2
참고 : .where (
jnoreiga

1
잠재적 인 결함이 있습니다. 확장명이 정확히 3 자 여야하는 시대는 지났습니다. 가 .abc있고 supportedExtensions에 포함 된 파일이 있다고 가정합니다 .abcd. 일치하지는 않지만 일치합니다. 수정하려면 :을 (를) supportedExtensions = ".jpg|.abcd|";사용하십시오 .Contains(Path.GetExtension(s).ToLower() + "|"). 즉, 테스트에 구분 문자를 포함하십시오. 중요 : separator 문자는 supportedExceptions에서 마지막 항목 뒤에 있어야합니다.
ToolmakerSteve

31

...에 대한

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

그러나 EnumerateFiles필터를 분할하고 결과를 병합 하면 실제 이점이 나타납니다.

public IEnumerable<string> FilterFiles(string path, params string[] exts) {
    return 
        exts.Select(x => "*." + x) // turn into globs
        .SelectMany(x => 
            Directory.EnumerateFiles(path, x)
            );
}

그것들을 glob (즉, exts = new[] {"*.mp3", "*.jpg"}이미) 으로 바꿀 필요가 없다면 조금 더 빨라집니다 .

다음 LinqPad 테스트를 기반으로 한 성능 평가 (참고 : Perf델리게이트를 10000 회만 반복) https://gist.github.com/zaus/7454021

(그 질문에 구체적으로 어떤 LINQ를 요구하지 않기 때문에 재 게시와 '중복'에서 확장 : 여러 파일 확장 된 searchPattern System.IO.Directory.GetFiles에 대한 )


"구글로 바꿀 필요가 없으면 조금 더 빨라진다"는 것은 무엇을 의미합니까? O (1)입니까 아니면 O (n)입니까 (확장자 수가 아닌 파일 수와 관련하여)? 나는 그것이 O (1) (또는 확장 수와 관련하여 O (n))이고 아마도 몇 CPU 사이클 범위에 있다고 생각했을 것입니다 ... 그런 경우라면 아마 성능이 현명합니다-무시할 수 있습니다
BatteryBackupUnit

@BatteryBackupUnit 예, 2 개의 확장에 대해 10k 반복을 사용하면 glob와 str의 차이는 3ms이므로 기술적으로 무시할 수 있습니다 (perf 결과 링크 참조). 차; 나는 "간단한 사용법"(즉, .FilterFiles(path, "jpg", "gif"))이 "명시 적 글로브"(즉, .FilterFiles(path, "*.jpg", "*.gif")) 보다 나은지 결정하기 위해 당신에게 맡깁니다 .
drzaus

고마워요 미안하지만 어떻게 든 github 링크를 건너 뛰었습니다. 어쩌면 내가 :) 내 화면 색상 설정을 적용해야한다
BatteryBackupUnit

.JPG 또는 .MKV와 같은 대문자 확장자를 지원합니까?
Wahyu

1
SelectMany 솔루션의 단점은 파일 확장자가 한 번만 전달 될 때마다 모든 파일을 반복한다는 것입니다.
17 of 26

16

나는 그것이 오래된 질문이지만 LINQ : (.NET40 +)

var files = Directory.GetFiles("path_to_files").Where(file => Regex.IsMatch(file, @"^.+\.(wav|mp3|txt)$"));

3
좋은 생각. file.ToLower()대문자 확장을 쉽게 일치시키기 위해 사용 하는 것을 고려하십시오 . 그리고 확장자를 먼저 추출하지 않기 때문에 Regex는 전체 경로를 검사 할 필요가 없습니다. Regex.IsMatch(Path.GetExtension(file).ToLower(), @"\.(wav|mp3|txt)");
ToolmakerSteve

13

메모리 나 성능 오버 헤드가없고 매우 우아해 보이는 하강 솔루션도 있습니다.

string[] filters = new[]{"*.jpg", "*.png", "*.gif"};
string[] filePaths = filters.SelectMany(f => Directory.GetFiles(basePath, f)).ToArray();

1
새로운 문자열 변수와 Split 함수를 사용하여 알 수없는 무제한의 확장을 허용하도록 편집 할 수 있다고 가정합니다. 그러나 jnoreiga의 솔루션보다 이것이 어떻게 더 낫습니까? 더 빠릅니까? 적은 메모리 소비?
브래킷

1
절충이 있습니다. 이 방법은 필터 당 하나씩 GetFiles를 여러 번 호출합니다. 이러한 여러 호출 은 경우에 따라 "성능 오버 헤드"가 클 수 있습니다. 각 GetFile이 일치하는 파일 경로를 가진 배열 만 반환한다는 중요한 이점이 있습니다. 나는 이것이 일반적 으로 우수한 성능 결과, 아마도 우수한 성능 일 것으로 기대 하지만 테스트해야합니다. GetFiles가 EnumerateFiles보다 훨씬 빠르면 이것이 가장 좋은 방법 일 수 있습니다. 또한 IEnumerable을 직접 사용할 수있는 경우 최종 ".ToArray ()"를 생략 할 수 있습니다.
ToolmakerSteve

11

Linq를 사용하는 또 다른 방법이지만 모든 것을 반환하고 메모리에서 필터링하지 않아도됩니다.

var files = Directory.GetFiles("C:\\path", "*.mp3", SearchOption.AllDirectories).Union(Directory.GetFiles("C:\\path", "*.jpg", SearchOption.AllDirectories));

실제로 2 GetFiles()번의 호출 이지만 질문의 정신과 일치하고 열거 가능한 것으로 반환합니다.


그렇다면 왜 Linq를 사용합니까? List와 addrange를 사용하는 것보다 빠를까요?
ThunderGr

1
나는 무엇이 더 빠를 지 모르고 그것이 중요한 질문이라고 생각하지 않습니다. 이 문제에 대한 해결책으로 코드를 사용하는 거의 모든 장소에서 성능의 차이는 무시할 수 있습니다. 앞으로 코드의 유지 관리를 용이하게하기 위해 더 읽기 쉬운 것이 무엇인지에 대한 질문이 있어야합니다. 나는 이것이 하나의 소스 라인에 들어가기 때문에 합리적인 대답이라고 생각합니다. list와 addrange는 동일한 작업을 수행하기 위해 여러 단계로 산만합니다.
Dave Rael

7

아니. 다음을 시도하십시오 :

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


7

허락하다

var set = new HashSet<string> { ".mp3", ".jpg" };

그때

Directory.GetFiles(path, "*.*", SearchOption.AllDirectories)
         .Where(f => set.Contains(
             new FileInfo(f).Extension,
             StringComparer.OrdinalIgnoreCase));

또는

from file in Directory.GetFiles(path, "*.*", SearchOption.AllDirectories)
from ext in set
where String.Equals(ext, new FileInfo(file).Extension, StringComparison.OrdinalIgnoreCase)
select file;

getfile에는 과부하 u가 게시되어 있지 않습니다.
nawfal

5

사용할 수 없습니다 .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);
    }
}

4

다음 함수는 쉼표로 구분 된 여러 패턴을 검색합니다. 제외를 지정할 수도 있습니다 (예 : "! 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);
            }

4
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);
}

file.Extension.ToLower()나쁜 습관입니다.
abatishchev

그럼 무엇을 사용해야합니까? @abatishchev
Nitin Sawant

@Nitin :String.Equals(a, b, StringComparison.OrdinalIgnoreCase)
abatishchev

1
실제로, file.Extension.Equals ( ". jpg", StringComparison.OrdinalIgnoreCase)는 내가 선호하는 것입니다. .ToLower 또는 .ToUpper보다 빠르므로 검색 한 모든 곳에서 말합니다. ==이 .Equals 호출하기 때문에 사실, .Equals는 물론, 빠른 ==보다 하고 (당신이 null.Equals (널)을 할 수 없기 때문에) 널 (null)에 대한 검사를.
ThunderGr

4

.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"))
{}

4
DirectoryInfo directory = new DirectoryInfo(Server.MapPath("~/Contents/"));

//Using Union

FileInfo[] files = directory.GetFiles("*.xlsx")
                            .Union(directory
                            .GetFiles("*.csv"))
                            .ToArray();

3

다른 방법을 찾았습니다. 여전히 하나의 작업이 아니라 다른 사람들이 그것에 대해 어떻게 생각하는지보기 위해 그것을 버립니다.

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;
}

3

이건 어떤가요

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

2

하나의 문자열 (예 : ".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"를 작성하십시오.


그것은 무엇인지 모른다s
브라켓

2
/// <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();
}

2

아니요. 원하는 파일 형식만큼 많이 호출해야한다고 생각합니다.

필요한 확장명을 가진 문자열에 배열을 취하는 함수를 직접 만든 다음 해당 배열을 반복하여 필요한 모든 호출을 수행합니다. 이 함수는 내가 보낸 확장명과 일치하는 파일의 일반 목록을 반환합니다.

도움이 되길 바랍니다.


1

나는 같은 문제가 있었고 올바른 해결책을 찾지 못하여 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");

1

왜 이렇게 많은 "솔루션"이 게시되어 있는지 궁금합니다.

GetFiles의 작동 방식에 대한 신인 이해가 옳다면 두 가지 옵션 만 있으며 위의 솔루션 중 하나를 다음과 같이 해결할 수 있습니다.

  1. GetFiles, 필터 : 빠르지 만 필터가 적용될 때까지 오버 헤드가 저장되어 메모리 킬러

  2. GetFiles 동안 필터링 : 더 많은 필터가 설정 될수록 느리지 만 오버 헤드가 저장되지 않으므로 메모리 사용량이 적습니다.
    이것은 위의 게시물 중 하나에서 인상적인 벤치 마크로 설명됩니다. 각 필터 옵션은 별도의 GetFile 작업을 유발하므로 하드 드라이브의 동일한 부분이 여러 번 읽 힙니다.

제 생각에는 옵션 1)이 더 좋지만 C : \와 같은 폴더에서 SearchOption.AllDirectories를 사용하면 많은 양의 메모리가 사용됩니다.
따라서 옵션 1을 사용하여 모든 하위 폴더를 통과하는 재귀 하위 메서드를 만들 것입니다.)

이로 인해 각 폴더에서 GetFiles 작업이 1 개만 발생하므로 속도가 빨라야하지만 (옵션 1) 각 하위 폴더를 읽은 후 필터가 적용되고 각 하위 폴더 다음에 오버 헤드가 삭제되므로 적은 양의 메모리 만 사용하십시오.

내가 틀렸다면 정정 해주세요. 나는 프로그래밍에 대해 아주 새로운 말을했지만 결국 이것에 익숙해지기 위해 사물에 대해 더 깊이 이해하고 싶습니다 :)


1

VB.NET을 사용하는 경우 (또는 C # 프로젝트로 종속성을 가져온 경우) 실제로 여러 확장을 필터링 할 수있는 편리한 방법이 있습니다.

Microsoft.VisualBasic.FileIO.FileSystem.GetFiles("C:\\path", Microsoft.VisualBasic.FileIO.SearchOption.SearchAllSubDirectories, new string[] {"*.mp3", "*.jpg"});

VB.NET에서는 My-namespace를 통해 액세스 할 수 있습니다.

My.Computer.FileSystem.GetFiles("C:\path", FileIO.SearchOption.SearchAllSubDirectories, {"*.mp3", "*.jpg"})

불행히도 이러한 편의 방법은 느리게 평가 된 변형을 지원 Directory.EnumerateFiles()하지 않습니다.


이것은 쉽게 가장 좋은 대답이지만 훨씬 더 해킹 된 것이 허용되는 것입니다. 너무 사랑해야합니다.
로비 코인

0

어떤 솔루션이 더 나은지 모르겠지만 이것을 사용합니다.

String[] ext = "*.ext1|*.ext2".Split('|');

            List<String> files = new List<String>();
            foreach (String tmp in ext)
            {
                files.AddRange(Directory.GetFiles(dir, tmp, SearchOption.AllDirectories));
            }

0

필터링 된 파일을 얻는 간단하고 우아한 방법은 다음과 같습니다.

var allowedFileExtensions = ".csv,.txt";


var files = Directory.EnumerateFiles(@"C:\MyFolder", "*.*", SearchOption.TopDirectoryOnly)
                .Where(s => allowedFileExtensions.IndexOf(Path.GetExtension(s)) > -1).ToArray(); 

-1

또는 확장 문자열을 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;
}

2
이것은 C ++이 아닌 C ++입니다.
Brackets

-1

확장명을 필터링하기 위해 GetFiles 검색 패턴을 사용하는 것은 안전하지 않습니다 !! 예를 들어 Test1.xls 및 Test2.xlsx 파일이 두 개이고 검색 패턴 * .xls를 사용하여 xls 파일을 필터링하려고하지만 GetFiles는 Test1.xls와 Test2.xlsx를 모두 반환합니다. 일부 임시 파일이 갑자기 올바른 파일로 처리 된 환경. 검색 패턴은 * .txt이고 임시 파일 이름은 * .txt20181028_100753898이므로 검색 패턴을 신뢰할 수 없으므로 파일 이름을 추가로 확인해야합니다.


질문에 대답하지 않습니다.
로비 코인
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.