파일 검색 함수는 특정한 조건에 맞는 파일을 검색한다. 예를 들어 a로 시작하고 확장자가 txt 인 모든 파일(*.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 드라이브 루트의 모든 파일을 검색하여 화면으로 출력하는 예제이다.
#include <Turboc.h>
#include <io.h>
void main() {
_finddata_t fd;
long handle;
int result=1;
handle=_findfirst(allPath.c_str(),&fd);
if (handle == -1) return;
while (result != -1) {
printf("파일명 : %s, 크기:%d\n",fd.name,fd.size);
result=_findnext(handle,&fd);
}
_findclose(handle);
}
검색 함수로 서브 디렉토리까지 검색하려면 재귀 호출을 사용한다.
다음은 C++ 언어와 OpenCV 라이브러리를 활용하여
디렉토리 안의 여러 개의 파일을 imshow로 오픈하는 예제이다.
디렉토리 안에는 여러 장의 이미지 파일이 포함되어 있으며,
처음에는 첫번째 이미지에 대하여 일련의 영상처리 과정을 imshow 를 통해 띄워주며,
스페이스바(ASCII : 32)를 눌렀을 때 다음 파일에 대한 일련의 영상처리 과정을 imshow 하고,
디렉토리 안에 있는 모든 파일에 대하여 영상처리를 할 때 까지 반복하는 예제이다.
#include "detection.h"
int main(int argc, char** argv)
{
string dirPath = "image/";
struct _finddata_t fd;
intptr_t handle;
int fileCheck = 1;
string allPath = dirPath + "*.jpg";
handle = _findfirst(allPath.c_str(), &fd); // 파일 검색을 위한 핸들러 지정
while (fileCheck != -1) { // 디렉토리의 모든 파일 검색
Detection *sample= new Detection(); // 객체 생성
cout << dirPath + fd.name << endl; // 파일 경로 및 이름 확인
sample->OpenFile(dirPath + fd.name);
while (waitKey(32) == -1); // 스페이스바를 누르면 한 이미지에 대한 영상처리 종료
delete sample; // 객체 소멸
destroyAllWindows(); // 한 이미지에 대한 윈도우 창 종료
fileCheck = _findnext(handle, &fd); // 다음 파일로 이동
}
_findclose(handle); // 파일 검색 종료
return 0;
}
참고자료 1 : http://soen.kr/lecture/ccpp/cpp2/17-4-2.htm
참고자료 2 : http://sks3297.tistory.com/entry