使用标准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?