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

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

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

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

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()을 쓰는 게 제일 빠른 방법이네요

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

작성한 답변에 다른 개발자들이 댓글을 작성하거나 댓글에 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.