本篇記錄一下 C/C++ 在 Windows / Linux / MacOS 各平台判斷資料夾是否存在的方法,
其中介紹順序以多平台適用的方法優先,其次是特定平台的方法。
判斷資料夾是否存在大約分為下列幾種方法,
- stat() (Windows / Linux / MacOS / Unix-like)
- boost::filesystem::exists() (Boost)
- std::filesystem::exists() (C++17)
- GetFileAttributesA() (Windows)
stat() (Windows / Linux / MacOS / Unix-like)
stat() 用於 Linux, UNIX 和 Windows 也適用
函式原型:int stat(const char *path, struct stat *buf);
,使用範例如下:1
2
3
4
5
6
7
8
9
10
11
struct stat info;
if (stat(path, &info) != 0)
printf("cannot access %s\n", path);
else if (info.st_mode & S_IFDIR)
printf("%s is a directory\n", path);
else
printf("%s is no directory\n", path);
常見的資料夾判斷函式
以下範例我自己在 Windows / Linux 都可以成功判斷.1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18// g++ cpp-is-dir-exists.cpp -o a.out
using namespace std;
bool dirExists(const std::string &path) {
struct stat info;
if (stat(path.c_str(), &info) == 0 && info.st_mode & S_IFDIR) {
return true;
}
return false;
}
int main() {
cout << dirExists("foo") << endl;
return 0;
}
boost::filesystem::exists() (Boost)
TBD
std::filesystem::exists() (C++17)
or std::filesystem::is_directory() 待驗證
GetFileAttributesA() (Windows)
函式原型:DWORD GetFileAttributesA(const char* filename);
,使用範例如下:1
2
3
4
5
6
7
8
9
10
11
12
bool dirExists(const std::string& path) {
DWORD ftyp = GetFileAttributesA(path.c_str());
if (ftyp == INVALID_FILE_ATTRIBUTES)
return false; //something is wrong with your path!
if (ftyp & FILE_ATTRIBUTE_DIRECTORY)
return true; // this is a directory!
return false; // this is not a directory!
}
參考
https://stackoverflow.com/questions/18100097/portable-way-to-check-if-directory-exists-windows-linux-c
https://blog.csdn.net/caroline_wendy/article/details/21734915
http://stackoverflow.com/questions/8233842/how-to-check-if-directory-exist-using-c-and-winapi
https://caojingyou.github.io/2017/02/15/C++%E4%B8%AD%E5%88%A4%E6%96%AD%E6%9F%90%E4%B8%80%E6%96%87%E4%BB%B6%E6%88%96%E7%9B%AE%E5%BD%95%E6%98%AF%E5%90%A6%E5%AD%98%E5%9C%A8/
- stat
- boost的filesystem类库的exists函数
std::filesystem::exists() (C++17) 相關參考
std::filesystem::exists - cppreference.com
https://en.cppreference.com/w/cpp/filesystem/exists
std::filesystem::is_directory - cppreference.com
https://en.cppreference.com/w/cpp/filesystem/is_directory
其它相關文章推薦
C/C++ 新手入門教學懶人包
C/C++ 判斷檔案是否存在
std::filesystem::copy 複製檔案的用法與範例
std::filesystem::create_directory 建立資料夾的用法與範例
std::filesystem::exists 判斷檔案是否存在的用法與範例