patterncppCritical
Fastest way to check if a file exists using standard C++/C++11,14,17/C?
Viewed 0 times
checkexistsstandardusingfilewayfastest
Problem
I would like to find the fastest way to check if a file exists in standard C++11, 14, 17, or C. I have thousands of files and before doing something on them I need to check if all of them exist. What can I write instead of
/ SOMETHING / in the following function?inline bool exist(const std::string& name)
{
/* SOMETHING */
}Solution
Well I threw together a test program that ran each of these methods 100,000 times, half on files that existed and half on files that didn't.
Results for total time to run the 100,000 calls averaged over 5 runs,
Method
Time
0.485s
0.302s
0.202s
0.134s
The
#include
#include
#include
#include
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);
}Results for total time to run the 100,000 calls averaged over 5 runs,
Method
Time
exists_test0 (ifstream)0.485s
exists_test1 (FILE fopen)0.302s
exists_test2 (posix access())0.202s
exists_test3 (posix stat())0.134s
The
stat() function provided the best performance on my system (Linux, compiled with g++), with a standard fopen call being your best bet if you for some reason refuse to use POSIX functions.Code Snippets
#include <sys/stat.h>
#include <unistd.h>
#include <string>
#include <fstream>
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);
}Context
Stack Overflow Q#12774207, score: 1049
Revisions (0)
No revisions yet.