C/C++11/C에서 파일의 존재를 알아내는 제일 빠른 방법은?
조회수 10666회
C++11/C++/C에서 파일이 있는 지 없는 지 알아내는 표준이 있나요? 파일을 열기 전에 파일이 존재하는지 검사하고 싶습니다.
밑의 코드에서 주석 부분을 만들어내려면 어떻게 해야 되나요?
inline bool exist(const std::string& name)
{
/* 파일이 있는지 없는지 알아냄 */
}
1 답변
-
제가 아는 방법은 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번쯤 돌려서 평균을 내 보니
exists_test0 (ifstream)
: 0.485sexists_test1 (FILE fopen)
: 0.302sexists_test2 (posix access())
: 0.202sexists_test3 (posix stat())
: 0.134s
정도였습니다.
POSIX 함수를 쓸 경우는
stat()
을, 그렇지 않은 경우는fopen()
을 쓰는 게 제일 빠른 방법이네요
댓글 입력