소스코드리뷰(XXI) 파일검색용 컴포넌트를 만들자

[목차(도우미)]
검색 대상 디렉토리를 지정하여 하위 디렉토리의 파일/디렉토리를 모두 구하는 처리는 인터넷 상에 많이 공개되어 있다. 마이크로소프트 윈도에서 FindFirstFile 함수를 사용하여 파일을 재귀적으로 호출하여 처리하는 것을 조금만 수고하면 얼마든지 찾을 수 있다.

검색 결과를 배열로 넘겨주는 방법

그러나 파일 검색 결과를 어떻게 호출 처리부분에 넘겨 줄 것인가에 관한여는 개발자가 고안할 필요가 있다. 파일을 검색하여 무언가 처리를 하려고 하기 때문에 결과를 하나의 배열(VB라면 Collection, Delphi라면 TStringList)등에 보관하여 돌려주는 것도 간편한 방법이다. 이런 함수를 공통함수로 만들면 나중에도 재사용할 수 있으므로 편리할 것이다.


검색 이벤트를 통지하는 방법

배열로 결과만을 넘겨 주는 경우는 소기의 목적을 이룰 수는 있으나 확장성이 떨어지기 마련이다. 검색되는 도중에 몇개가 검색되었는지를 알수도 없고, 어떤 파일이 검색되고 있는지 알수도 없다. 그래서 결과만을 넘겨주는 방식보다는 검색 이벤트를 넘겨주고 객체화하는 것이 훨씬 유용하다. 말로 긴 설명보다 간단한 선언 예를 보는 것이 이해하기 쉬울 것이다.

소스코드예

편의상 델파이 소스를 예로 사용한다.

  1. TOnFoundEvent : procedure(Sender:TObject; FileName:String) of object;
  2. TFileFinder = class(TObject)
  3.   private
  4.     FOnFound : TOnFoundEvent; //이벤트 정의
  5.     FOnStart: TNotifyEvent;   //시작 통지
  6.     FOnFinish: TNotifyEvent; //완료 통지. Count를 매개변수로 넘겨도 좋다
  7.     FCount : integer; //검색 파일 수
  8.     FFilePath: String; //검색 대상
  9.     FAttribute: TAttribute; //파일 속성
  10.   public
  11.     property OnFound:TOnFoundEvent read FOnFound write FOnFound;
  12.     function FileFind(FilePath : String):integer;
  13.     (생략)
  14.   end;

파일을 검색하는 경로를 주고 검색 조건(파일 속성에 관한 WIN32_FILE_DATA구조체의 Attribute부분)은 클래스의 속성(property)로 디폴트값을 지정하는 것이 편리하고, 검색될 때마다 OnFound 이벤트가 발생하여 호출 모듈에서 나머지는 용도에 맞게 구성하면 된다.

베고니아

(식물원: 베고니아꽃을 키워보았는데 식물원에서도 만나니 반갑다.)

by 금메달.아빠 on 2010. 9. 18. 22:18