V3 라던가 , ADaware 라던가 ... 항상 나오는게 바로 파일 검색 입니다.
파일 검색은 console 에서 dir 이나 , ls 명령으로 가능 하겠 습니다만, 실제로 C 코드내에서 쓰이는 것이라면 이런걸로는 무리겠죠 ^^
그럼 어떻게 할까요 ?
다음 코드는 제가 Pascal 에서 쓰던 것을 옮긴 코드 입니다 (어차피 API 부르는것 이니까요)
이 코드는 재귀호출에 의해 파일 목록을 만들어 주는 코드 입니다.
사용자가 추가로 넣어야 할 부분은 바로 psypath 에 값이 들어간 다음 이 되겠습니다.
그럼 인자값은 어떻게 넣고 , 어떻게 시작 되어야 할까요 ?
char *path 에 들어가는 인자값은 반드시 와일드 카드 포함 입니다.
즉, C 드라이브의 루트로 부터 모든 파일 디렉토리를 찾고 싶다면.
SearchFileList("C:\\*.*");
으로 시작하여야 합니다.
도중에 들어가는 Sleep(10); 빠른 루프문으로 인해 생기는 문제를 해결하기 위해서 넣긴 했습니다만, 이런 코드는 Thread 로 생성하여 사용하시는 것이 현명한 방법일 것입니다.
파일 검색은 console 에서 dir 이나 , ls 명령으로 가능 하겠 습니다만, 실제로 C 코드내에서 쓰이는 것이라면 이런걸로는 무리겠죠 ^^
그럼 어떻게 할까요 ?
다음 코드는 제가 Pascal 에서 쓰던 것을 옮긴 코드 입니다 (어차피 API 부르는것 이니까요)
{ HANDLE hSrch; WIN32_FIND_DATA wfd; BOOL bResult=TRUE; char drive[_MAX_DRIVE]; char dir[MAX_PATH]; char newpath[MAX_PATH]; char psypath[MAX_PATH]; hSrch=FindFirstFile(path,&wfd); if (hSrch == INVALID_HANDLE_VALUE) { return; } _splitpath(path,drive,dir,NULL,NULL); while (bResult) { if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { if (strcmp(wfd.cFileName,".") && strcmp(wfd.cFileName,"..")) { ⁄⁄ 디렉토리 이므로 재귀호출로 찾아 낸다. sprintf(newpath,"%s%s%s\\*.*",drive,dir,wfd.cFileName); SearchFileList(newpath); Sleep(10); } } else { ⁄⁄ 파일 위치와 이름 을 psypath 에 넣는다. ⁄⁄ 만약 리스트에 넣을 것이라면 , psypath 를 추가하면 된다. sprintf(psypath,"%s%s%s",drive,dir,wfd.cFileName); } bResult=FindNextFile(hSrch,&wfd); } FindClose(hSrch); }
이 코드는 재귀호출에 의해 파일 목록을 만들어 주는 코드 입니다.
사용자가 추가로 넣어야 할 부분은 바로 psypath 에 값이 들어간 다음 이 되겠습니다.
그럼 인자값은 어떻게 넣고 , 어떻게 시작 되어야 할까요 ?
char *path 에 들어가는 인자값은 반드시 와일드 카드 포함 입니다.
즉, C 드라이브의 루트로 부터 모든 파일 디렉토리를 찾고 싶다면.
SearchFileList("C:\\*.*");
으로 시작하여야 합니다.
도중에 들어가는 Sleep(10); 빠른 루프문으로 인해 생기는 문제를 해결하기 위해서 넣긴 했습니다만, 이런 코드는 Thread 로 생성하여 사용하시는 것이 현명한 방법일 것입니다.