C/C++ 判斷資料夾是否存在

本篇記錄一下 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
#include <sys/types.h>
#include <sys/stat.h>

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 都可以成功判斷.

cpp-is-dir-exists.cpp
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
#include <sys/stat.h>
#include <iostream>

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
#include <windows.h>

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 判斷檔案是否存在的用法與範例