[.NET] 디렉토리의 파일 목록 조사 + 필터링. Linq와 람다식을 이용한 Directory.GetFiles 확장자 지정하기.

 

 

사용자에게 폴더를 선택하게끔 하고, 해당 폴더 안에 들어있는 파일을 리스트업 해줘야 할 때가 있다.

.NET에서는  System.IO.Directory.GetFiles 를 이용해서 디렉토리 내 파일 목록을 얻어올 수 있다.

사용방법은 잘들 아시겠지만 다음과 같다.

 

Dim DataFileNM As String() = Directory.GetFiles(TargetFolderNM, "*.*", SearchOption.TopDirectoryOnly)

 

여기서 보듯이 GetFiles메서드에는 패턴검색 옵션을 지정할 수가 있게 되어있는데(searchpattern)

이 패턴 옵션이 뭔가 어정쩡하다.

 

예를들어, 폴더 내의 이미지파일을 모두 보여주고 싶을 때에는 파일확장명에 *.gif, *.tif, *.jpg, *.png, *.bmp 가 지정되어야 할 것이다.

하지만 익숙한 확장자 나열 기법을 적용해서

Directory.GetFiles(TargetFolderNM, "*.gif|*.jpg|*.png", SearchOption.TopDirectoryOnly) 처럼 사용하면 에러가 발생한다.

searchpattern에는 와일드카드를 사용할 수 있지만, 조건식을 나열할 수는 없는 반쪽짜리인 것이다..-_-

꼭 단일 확장자로만 지정을 해줘야 한단다.

 

그래서 그럼 이렇게 해보았다. Concat메서드로  리턴된 배열을 합쳐버리는 방법이다.

 

DataFileNM = Directory.GetFiles(TargetFolderNM, "*.jpg", SearchOption.TopDirectoryOnly)
DataFileNM = DataFileNM.Concat(Directory.GetFiles(TargetFolderNM, "*.tif", SearchOption.TopDirectoryOnly).ToArray)

 

하지만 이 방법 역시 경우에 따라서 오류가 발생한다.

Concat 메서드는 연결할 첫 번째 시퀀스가 nothing일 경우 ArgumentNullException 에러를 발생시킨다.

즉, 첫번째줄에서 *.jpg파일이 하나도 발견되지 않았다면  *.tif 에서 반환된 파일목록 배열은 붙을곳을 찾지 못해 오류가 나는 것이다..

모든 폴더에 jpg파일이 최소한 한개씩은 있어준다는 보장이 없으니 이 역시 사용불가이다. 물론 이것도 조건분기를 처리해서 DataFileNM이 Nothing일 경우엔 그냥 할당하고  아닐경우에만 Concat을 하는 식으로 코딩할 수는 있겠으나 바람직한 코딩이 아니다.

 

 

사설이 길었는데, 이러한 연유로 아래의 방식을 찾았다.  별도의 함수를 만들지 않아도 되고 코드 길이도 짧다.

실로 베스트한 방식이 아닐수 없다. 후후후 -_ㅡv

여기엔 Linq와 람다식이 사용되었다.

 

[VB.net]

'***** 지정된 폴더에서 특정 이미지 파일만 찾아온다.
Dim DataFileNM As String()
Dim exts As String() = {".tif", ".jpg", ".gif"}

 

DataFileNM = Directory.GetFiles(TargetFolderNM, "*.*", SearchOption.TopDirectoryOnly).Where(Function(s) exts.Contains(Path.GetExtension(s), StringComparer.OrdinalIgnoreCase)).ToArray 

 

[C#.net]

string[] exts = new [] {".tif", ".jpg", ".gif"};

string[] DataFileNM =  Directory.GetFiles(TargetFolderNM, "*.*", SearchOption.TopDirectoryOnly).Where(s=>exts.Contains(Path.GetExtension(s), StringComparer.OrdinalIgnoreCase)).ToArray;

 

 

일단  exts에 필터링 할 확장자를 배열로 지정해 놓고

Directory.GetFiles(TargetFolderNM, "*.*", SearchOption.TopDirectoryOnly) 로 폴더내 모든 파일을 가져온다(String배열)

여기서 .Where(Function(s) exts.Contains(Path.GetExtension(s), StringComparer.OrdinalIgnoreCase)) 으로  확장자를 필터링해서 .ToArray로 다시 변환해서 리턴하는 것이다.

 

그러면 DataFileNM 스트링배열 개체에  해당 파일명이 아름답게 담겨지게 된다!

 

+ Recent posts