17-4-나.파일 검색

파일 검색 함수는 특정한 조건에 맞는 파일을 검색한다. 예를 들어 a로 시작하고 확장자가 txt인 모든 파일(a*.txt)를 찾아 어떤 작업을 하고 싶다면 이 조건에 맞는 파일을 먼저 찾아야 한다. 파일을 검색하는 함수는 다음 세 함수이다.

 

long _findfirst( char *filespec, struct _finddata_t *fileinfo );

int _findnext( long handle, struct _finddata_t *fileinfo );

int _findclose( long handle );

 

findfirst 함수의 filespec 인수로 검색식을 주면 조건에 맞는 첫 번째 파일을 찾아 fileinfo 구조체에 검색된 파일의 정보를 채우고 검색 핸들을 리턴한다. 만약 조건에 맞는 파일이 하나도 없다면 이때는 -1이 리턴된다. _finddata_t 구조체는 io.h 헤더 파일에 다음과 같이 정의되어 있다.

 

struct _finddata_t {

    unsigned    attrib;

    time_t      time_create;    /* -1 for FAT file systems */

    time_t      time_access;    /* -1 for FAT file systems */

    time_t      time_write;

    _fsize_t    size;

    char        name[260];

};

 

파일의 속성, 이름, 날짜, 크기 등에 대한 정보를 가지며 이 구조체를 참조하면 어떤 파일이 검색되었는지 알 수 있다. _findfirst 함수로 첫 번째 검색을 한 후 _findnext 함수로 조건이 일치하는 다음 파일을 계속 찾을 수 있으며 _findnext가 -1을 리턴할 때까지 반복하면 조건에 맞는 모든 파일을 다 찾게 된다. 검색이 끝나면 _findclose 함수로 검색 핸들을 닫아 검색을 종료한다. 다음 예제는 C드라이브 루트의 모든 파일을 검색하여 화면으로 출력한다.

 

: findfirst

#include <TurboC.h>

#include <io.h>

 

void main()

{

     _finddata_t fd;

     long handle;

     int result=1;

 

     handle=_findfirst("c:\\*.*",&fd);

     if (handle == -1) return;

     while (result != -1) {

          printf("파일명 : %s, 크기:%d\n",fd.name,fd.size);

          result=_findnext(handle,&fd);

     }

     _findclose(handle);

}

 

검색 함수로 서브 디렉토리까지 검색하려면 재귀 호출을 사용한다. 파일 검색이 필요한 경우는 아주 흔한데 통상 C 런타임 함수를 직접 사용하는 경우보다 운영체제의 검색 함수를 사용하는 것이 더 좋다. 왜냐하면 운영체제는 C 런타임 함수의 검색 함수보다 훨씬 자세한 검색을 할 수 있기 때문이다. 16장의 재귀 호출편에서 API 함수를 사용한 디렉토리 검색 예제를 다룬 바 있으므로 16장의 예제를 참조하기 바란다.