728x90
반응형



파일 검색 함수는 특정한 조건에 맞는 파일을 검색한다. 예를 들어 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

728x90
반응형