file 버전 c++11 - 표준 C ++ / C ++ 11 / C를 사용하여 파일이 있는지를 확인하는 가장 빠른 방법은 무엇입니까?





8 Answers

나는이 코드를 사용하여, 지금까지 나와 함께 잘 작동한다. 이것은 C ++의 많은 멋진 기능을 사용하지 않습니다.

bool is_file_exist(const char *fileName)
{
    std::ifstream infile(fileName);
    return infile.good();
}
기능 stl이란 c++14

나는 파일이 표준 C ++ 11, C ++ 또는 C에 있는지를 확인하는 가장 빠른 방법을 찾고 싶습니다. 수천 개의 파일이 있고 그 파일에 무언가를하기 전에 모든 파일이 있는지 확인해야합니다. /* SOMETHING */ 대신 다음 함수에서 쓸 수있는 것은 무엇입니까?

inline bool exist(const std::string& name)
{
    /* SOMETHING */
}



파일이있는 위치에 따라 다릅니다. 예를 들어, 모두 같은 디렉토리에 있다고 가정하면 모든 디렉토리 항목을 해시 테이블로 읽어 들여 해시 테이블에 대해 모든 이름을 확인할 수 있습니다. 일부 시스템에서는 각 파일을 개별적으로 검사하는 것보다 빠를 수도 있습니다. 각 파일을 개별적으로 검사하는 가장 빠른 방법은 시스템에 따라 다릅니다 ... ANSI C를 작성하는 경우 가장 빠른 방법은 파일이기 때문에 가능하지만 파일을 열 수는 없기 때문에 fopen . 그러나 if open ifable if 당신은 "그것에 뭔가를해야한다"). C ++, POSIX, Windows는 모두 추가 옵션을 제공합니다.

제가 그 동안 질문에 대한 몇 가지 문제점을 지적하겠습니다. 가장 빠른 방법을 원하고 수천 개의 파일을 가지고 있다고하지만, 단일 파일을 테스트하는 함수의 코드를 요청합니다.이 함수는 C가 아닌 C ++에서만 유효합니다. 이것은 해결책에 대한 가정을함으로써 요구 사항을 모순됩니다 ... XY 문제 의 경우. 또한 "표준 C ++ 11 (또는) C ++ (또는) C"... 모두 다르고, 이것은 또한 속도에 대한 요구 사항과 일치하지 않습니다 ... 가장 빠른 솔루션은 코드를 목표 시스템. 이 질문의 불일치는 시스템 의존적이고 표준 C 또는 C ++가 아닌 솔루션을 제공하는 대답을 받아 들인 사실에 의해 강조됩니다.




다른 라이브러리를 사용하지 않고 다음 코드 스 니펫을 사용하고 싶습니다.

#ifdef _WIN32
   #include <io.h> 
   #define access    _access_s
#else
   #include <unistd.h>
#endif

bool FileExists( const std::string &Filename )
{
    return access( Filename.c_str(), 0 ) == 0;
}

이것은 Windows 및 POSIX 호환 시스템에서 크로스 플랫폼으로 작동합니다.




inline bool exist(const std::string& name)
{
    ifstream file(name);
    if(!file)            // If the file was not found, then file is 0, i.e. !file=1 or true.
        return false;    // The file was not found.
    else                 // If the file was found, then file is non-0.
        return true;     // The file was found.
}



bool b = std::ifstream('filename').good(); 수행 할 수도 있습니다 bool b = std::ifstream('filename').good(); . if와 같은 분기 명령어가 없으면 수천 번 호출해야하므로 더 빨리 수행해야합니다.




all_of (begin(R), end(R), [](auto&p){ exists(p); })

여기서 R 은 경로와 비슷한 것의 시퀀스이고 exists() 는 미래의 표준 또는 현재의 부스트로부터 온 것입니다. 자신 만의 것을 굴리는 경우 간단하게 유지하십시오.

bool exists (string const& p) { return ifstream{p}; }

분기 된 솔루션은 절대적으로 끔찍한 것이 아니며 파일 설명자를 중얼 거릴 수 없습니다.

bool exists (const char* p) {
    #if defined(_WIN32) || defined(_WIN64)
    return p && 0 != PathFileExists (p);
    #else
    struct stat sb;
    return p && 0 == stat (p, &sb);
    #endif
}



std::ifstream , is_open 과 같은 is_open 사용할 수 있습니다. 예를 들어 아래 코드와 같이 fail 할 수 있습니다. "cout"은 파일이 존재하는지 여부를 의미합니다.

이 answer 에서 인용




C ++에서 17 :

#include <experimental/filesystem>

bool is_file_exist(std::string& str) {   
    namespace fs = std::experimental::filesystem;
    fs::path p(str);
    return fs::exists(p);
}





Related