본문 바로가기

어떻게 할까

[Win32.API] 파일검색.

V3 라던가 , ADaware 라던가 ... 항상 나오는게 바로 파일 검색 입니다.
파일 검색은 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 로 생성하여 사용하시는 것이 현명한 방법일 것입니다.