C/C++11/C에서 파일의 존재를 알아내는 제일 빠른 방법은?


C++11/C++/C에서 파일이 있는 지 없는 지 알아내는 표준이 있나요? 파일을 열기 전에 파일이 존재하는지 검사하고 싶습니다.

밑의 코드에서 주석 부분을 만들어내려면 어떻게 해야 되나요?

inline bool exist(const std::string& name)
{
    /* 파일이 있는지 없는지 알아냄 */
}

조회수 203


1 답변


좋아요
0
싫어요
채택취소하기

제가 아는 방법은 4가지 정도입니다.

#include <sys/stat.h>
#include <unistd.h>

inline bool exists_test0 (const std::string& name) {
    ifstream f(name.c_str());
    if (f.good()) {
        f.close();
        return true;
    } else {
        f.close();
        return false;
    }   
}

inline bool exists_test1 (const std::string& name) {
    if (FILE *file = fopen(name.c_str(), "r")) {
        fclose(file);
        return true;
    } else {
        return false;
    }   
}

inline bool exists_test2 (const std::string& name) {
    return ( access( name.c_str(), F_OK ) != -1 );
}

inline bool exists_test3 (const std::string& name) {
  struct stat buffer;   
  return (stat (name.c_str(), &buffer) == 0); 
}

각 함수의 성능은 linux에서 g++에서 테스트 케이스는 100,000개 path 중 50,000개만 실제로 있는 파일 인 경우를 5번쯤 돌려서 평균을 내 보니

  1. exists_test0 (ifstream): 0.485s
  2. exists_test1 (FILE fopen): 0.302s
  3. exists_test2 (posix access()): 0.202s
  4. exists_test3 (posix stat()): 0.134s

정도였습니다.

POSIX 함수를 쓸 경우는 stat()을, 그렇지 않은 경우는 fopen()을 쓰는 게 제일 빠른 방법이네요

  • 2016년 01월 24일에 작성됨

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close