使用标准C ++ / C ++ 11 / C来检查文件是否存在的最快方法?

我想找到最快的方法来检查标准C ++ 11,C ++或C中是否存在一个文件。我有数千个文件,在对它们做某些事情之前,我需要检查它们是否都存在。 我可以在下面的函数中写什么而不是/* SOMETHING */

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

那么我把一个测试程序扔在一起,每个这样的方法运行10万次,一半是存在的文件,另一半是没有的文件。

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

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

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); 
}

在5次运行中平均运行100,000次呼叫的总时间的结果,

Method exists_test0 (ifstream): **0.485s**
Method exists_test1 (FILE fopen): **0.302s**
Method exists_test2 (posix access()): **0.202s**
Method exists_test3 (posix stat()): **0.134s**

stat()函数在我的系统上提供了最好的性能(Linux,使用g ++编译),如果由于某种原因拒绝使用POSIX函数,标准fopen调用是最好的选择。


我使用这段代码,到目前为止,它对我来说工作正常。 这不使用C ++的许多奇特功能:

bool is_file_exist(const char *fileName)
{
    std::ifstream infile(fileName);
    return infile.good();
}

备注:在C ++ 14中,一旦文件系统TS完成并被采纳,解决方案将使用:

std::experimental::filesystem::exists("helloworld.txt");

并希望仅在C ++ 17中:

std::filesystem::exists("helloworld.txt");
链接地址: http://www.djcxy.com/p/54565.html

上一篇: Fastest way to check if a file exist using standard C++/C++11/C?

下一篇: Create a file if one doesn't exist