파일/폴더 존재 여부 파악하기

Programming/Code 2010.12.09 댓글 Joshua95
 * 파일 / 폴더 존재 여부 파악하기
어떻게 확인하면 가장 빠르게 파일/폴더 여부를 확인할 수 있을까?

1) 가능한 파일을 안 열어보고 알 수 있어야 하고,
2) 경로는 전체 경로를 알고 있어서 곧바로 접근 가능하며,
3) 불필요한 index 파일 없이 빠르게 접근하는 방법을 고민 중이다.

일단 원하는 파일의 이름은 언제든 전체 경로를 만들어낼 수 있다는 가정하에
가장 빠르게 해당 파일이 존재하는지 여부를 알 수 있다면,
FindFile 등을 이용한 불필요한 디렉토리 검색을 사용하지 않아도 되고,
불필요하게 폴더 구조를 저장할 정보 파일을 만들 필요 없을 터이니
이를 해결하고자 이래저래 방법을 찾아 테스트를 해 본다.
 
// 1) CreateFile 사용
// 1) 폴더 검사
HANDLE        hFolderFile = NULL;

// 두번째 파라미터 - 0, 여섯번째 파라미터 - FILE_FLAG_BACKUP_SEMANTICS
hFolderFile = CreateFile(strDirPath,
        0,
        FILE_SHARE_READ,
        NULL,
        OPEN_EXISTING,
        FILE_FLAG_BACKUP_SEMANTICS,
        NULL);

if(INVALID_HANDLE_VALUE != hFile) 
{
   // Bingo!
}

// 2) 파일 검사
HANDLE        hFile = NULL;
// 두번째 파라미터 - 0
hFile = CreateFile(strFilePath,
        0,   
        FILE_SHARE_READ,
        NULL,
        OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL,
        NULL);

if(INVALID_HANDLE_VALUE != hFile) 
{
   // Bingo!
}
 테스트 결과:
  - 86,400 개 파일 검사 (8,640개 파일 존재) - 578 ms
  - 2,592,000 개 파일 검사 (0개 파일 존재) - 2,484 ms
 
  참고) dwDesiredAccess=GENERIC_READ로 설정한 경우
  - 86,400 개 파일 검사 - 9,531 ms
 

 2) _access 사용
// 폴더/파일 검사
if( (_access(strDirPath , 0 )) != -1 )
{
   // Bingo!
}
 테스트 결과:
  - 86,400 개 파일 검사 (8,640 파일 존재) - 219 ms
  - 2,592,000 개 파일 검사 (0개 파일 존재) - 890 ms
 

 3) PathIsDirectory, PathFileExists 사용
이런 API도 있었군요.
// 1) 폴더 검사
if(FALSE != PathIsDirectory(strDirPath))
{
   // Bingo!
}
 
// 2) 파일 검사
if( FALSE != PathFileExists(strFilePath) )
{
   // Bingo!
}
 테스트 결과:
  - 86,400 개 파일 검사 (8,640 파일 존재) - 219 ms
  - 2,592,000 개 파일 검사 (0개 파일 존재) - 859 ms


최종결론: _access 나 PathIsDirectory 계열을 사용하자!


 - 2010.12.09 by Johsua95

댓글