2013-11-27 2 views
10
내가 특정 파일을 반환하려면 다음 줄을 사용하고

...있는 GetFiles() - 검색 패턴

FileInfo file in nodeDirInfo.GetFiles("*.sbs", option) 

그러나이 확장 ".sbsar"과 디렉토리에 다른 파일이, 그리고 그들을 점점 너무. 검색 패턴에서 ".sbs"와 ".sbsar"를 어떻게 구별 할 수 있습니까?

+1

적어도 GetFiles/GetDirectories는 사용할 수 없습니다. 이것은 검색 패턴의 "제한"입니다. 결과를 반복하고 원하는 필터를 수동으로 필터링해야합니다. – varocarbas

+0

또한 이것을 살펴보십시오. http://msdn.microsoft.com/en-us/library/wz42302f(v=vs.110).aspx –

+0

가능한 [GetFiles()와의 정확한 확장명 일치?]]] 복제본 http://stackoverflow.com/questions/5573063/exact-file-extension-match-with-getfiles) – Borja

답변

4

파일 확장명을 사용하여 필터링 해보세요.

FileInfo[] files = nodeDirInfo.GetFiles("*", SearchOption.TopDirectoryOnly). 
      Where(f=>f.Extension==".sbs").ToArray<FileInfo>(); 
3

GetFiles() 아래에있는 Win32 API (FindFirstFile)의 동작입니다.

GetFiles()을 사용해야하는 경우 필터링을 직접 수행해야합니다. 보다 효율적으로

GetFiles("*", searchOption).Where(s => s.EndsWith(".sbs", 
    StringComparison.InvariantCultureIgnoreCase)); 

또는 : 나는 Windows 파일 이름은 대소 문자를 구별한다는 사실 다루는 StringComparison.InvariantCultureIgnoreCase를 사용

EnumerateFiles("*", searchOption).Where(s => s.EndsWith(".sbs", 
    StringComparison.InvariantCultureIgnoreCase)); 

참고 예를 들어.

많은 수의 파일이있는 디렉터리를 검색해야하는 경우 성능이 문제가되는 경우 GetFiles 또는 EnumerateFiles으로 전화를 한 번 필터링 한 다음 필터를 한 번만 정리하면됩니다 원하지 않는 파일 이름. 예를 들어 :

GetFiles("*.sbs", searchOption).Where(s => s.EndsWith(".sbs", 
    StringComparison.InvariantCultureIgnoreCase)); 
EnumerateFiles("*.sbs", searchOption).Where(s => s.EndsWith(".sbs", 
    StringComparison.InvariantCultureIgnoreCase)); 
+0

@Joey 저에게 조금 더러워 져서 필터를 복제 한 것 같습니다. 하지만 아마도 perf 함의가있을 것입니다.그렇지 않다면 차라리 하나의 필터 만 갖고 싶습니다. –

+0

더 빠릅니다. ;-) 작은 테스트에서 (완전한 원본 폴더에서'* .cpp'를 검색하면서)'GetFiles'에서 필터를 지정하는 것이 약 10-25 % 더 빠릅니다. 'EnumerateFiles'는 약간 느리지 만 대용량 결과 집합에 대해서는 훨씬 적은 메모리를 사용합니다. – Joey

+0

@Joey 네, 그건 합리적이라고 생각합니다. 나는 그것이 향수와 순결 사이의 균형에 달려 있다고 생각한다. 나는 대답에서 이것을 지금 다루었 다. –

9

당신이 겪고있는 문제는 Win32 API를에, 검색 패턴의 limitation입니다. 정확히 세 문자 (예 : * .txt)로 파일 확장자

의 searchPattern 파일은 처음 세 문자가 된 searchPattern에 지정된 파일 확장자 일치 세 이상 문자의 확장을 가진 반환 .

내 용액을 수동으로 이용하여 검색 결과를 필터링 Linq에있다 :

nodeDirInfo.GetFiles("*.sbs", option).Where(s => s.EndsWith(".sbs"), 
    StringComparison.InvariantCultureIgnoreCase)); 
+2

여기에서는 대문자를 고려하지 않습니다. –

+0

사실입니다. –

0

의 searchPattern에서 별표 와일드 카드 문자를 사용하는 경우

docs 언급 그하는 가진 의 searchPattern 정확히 3 자의 파일 확장자 은 3 자 이상의 확장자를 가진 파일을 반환합니다. 물음표 와일드 카드 이 메서드는 지정된 파일 확장명과 일치하는 파일 만 을 반환합니다.

+0

이것이 사실이라면 그것은 놀랄 것입니다. 불행히도, MSDN의 searchPattern에 대한 새로운 설명이 나왔습니다. :) 호기심을 느끼고 몇 가지 테스트를했는데 여기에 내 결론이옵니다. – varocarbas

+0

@varocarbas 참으로 .. 어디서'? '를 사용할 수 있습니까? .OP는'* a? .sbs'를 사용할 수 있습니다. 그렇다면'a'가 파일 이름 어딘가에 있어야합니다. – Anirudha

+2

'nodeDirInfo.GetFiles ("5? .txt");'.txt 만 가진 파일을 반환합니다. 'nodeDirInfo.GetFiles ("? .txt");'이름에 .txt 파일을 하나만 리턴합니다 (.txt를 포함하지 않음). 찾고있는 파일 이름의 최대 길이를 안다면'????. txt' 접근법을 사용하여 * .txt 만 얻을 수 있습니다 (??. txt는 이름에 1 또는 2 문자가있는 모든 파일을 되 찾습니다. txt 모든 1,2, 3 등). – varocarbas