2016-07-21 3 views
0

Directory.GetFiles()에 대한 스택 오버플로에 대한 몇 가지 질문이 있지만 모든 경우에이 파일을 사용하여 특정 확장자를 찾는 방법을 설명합니다 또는 여러 기준을 통해 파일 집합을 가져올 수 있습니다. 하지만 제 경우에는 Directory.GetFiles()에 대한 검색 패턴을 얻습니다.이 패턴은 디렉토리의 모든 파일을 반환하지만 정규식은 지정한 것입니다. 나는 그 차이를 원한다는 것을 선언하지 않는다. 예를 들어, html이 아닌 디렉토리의 모든 파일을 원한다면. 내가 파일의 또 다른 종류의 필터링 할 경우 나중에 내가 코드를 변경해야Directory.GetFiles()를 사용하여 특정 파일 확장명을 제외한 모든 파일 선택

var filteredFiles = Directory 
.GetFiles(path, "*.*") 
.Where(file => !file.ToLower().EndsWith("html"))) 
.ToList(); 

을하지만 이것은 매우 재사용 가능한 해결책이 아니다 : i '를, 통지, m는이 방법으로 그것을 달성 할 수 알고 || Where 조건. 나는 나가 얻고 Directory.GetFiles()에 그것을 통과하고 싶지 않는 파일에서 이루어져있는 정규식을 창조하는 것을 허용하는 무언가를 찾고있다. 그래서, 나중에 더 많은 확장을 위해 필터링하고 싶다면, 그냥 정규식을 변경하는 것입니다. 그래서 기본적으로 그냥 문자열에 정규식 일치를 수행하는 방법을 모르는

// for example a field or property in your class 
private HashSet<string> ExtensionBlacklist { get; } = 
    new HashSet<string>(StringComparer.InvariantCultureIgnoreCase) 
    { 
     ".html", 
     ".htm" 
    }; 
// ... 

var filteredFiles = Directory.EnumerateFiles(path, "*.*") 
    .Where(fn => !ExtensionBlacklist.Contains(System.IO.Path.GetExtension(fn))) 
    .ToList(); 
+0

매우 유사한 http://stackoverflow.com/questions/13301053/directory-getfiles-of-certain-extension을 참조하십시오. –

답변

7

당신은 정규식이 필요하지 않습니다?

바로 그 목적을 위해 Regex.IsMatch이 있습니다. 그러나 필터 확장 집합에서 확장을 조회하도록 코드를 변경하면 새 필터를 쉽게 추가 할 수 있습니다.

+0

이 부분과 정규 표현식 사이의 손익분기 점이 어디인지 궁금합니다. '포함'은 배열이 길수록 속도가 느려집니다. – Joey

+0

@Joey : 대신'HashSet '을 사용하십시오. 정규 표현식보다 항상 더 효율적일 것입니다 –

+0

감사합니다 Tim. 너는 그 생각을 가지고있어. 내 문제에 대한 꽤 깨끗한 솔루션입니다 –

0

: 당신이 확장 (들)을 필터링 할 경우

1

나는 이런 식의 찬성 정규식을 사용하여에 추천 할 것입니다 :

var excludedExtensions = new List<string>(new[] {".html", ".xml"}); 

Any 것이다 단락 :

var filteredFiles = Directory 
    .GetFiles(path, "*.*") 
    .Where(file => !excludedExtensions.Any<string>((extension) => 
    file.EndsWith(extension, StringComparison.CurrentCultureIgnoreCase))) 
    .ToList(); 

당신은, 당신 제외 확장의 그것을 예를 컬렉션을 전달할 수 있습니다 제외 된 광고 확장에서 일치하는 항목을 찾으면 바로 이것이 excludedExtensions.Contains() 인 것이 바람직하다고 생각합니다. 정규식에 관해서는, 나는 그것이 당신을 살 수있는 문제를 감안할 때 그것을 사용할 좋은 이유가 있다고 생각하지 않는다. 작업을위한 유일한 도구가 아닌 이상 regex를 사용하지 마십시오.

+0

Rory 정규 표현식을 가져 주셔서 감사합니다. 나는 명심 할거야. –

관련 문제