在 C++ 中獲取當前目錄
Jinku Hu
2023年10月12日
本文將介紹幾種在 C++ 中獲取當前目錄的方法。
使用 getcwd
函式獲取當前目錄的方法
getcwd
是一個相容 POSIX 的函式,在許多基於 Unix 的系統上都可以使用,它可以檢索當前的工作目錄。該函式需要兩個引數-第一個 char*
緩衝區,其中存放目錄路徑名和緩衝區的大小。請注意,我們宣告 char
為固定長度的陣列,並分配 256 元素的緩衝區,作為一個隨機的例子。如果呼叫成功,可以通過訪問 char
緩衝區列印當前目錄的儲存名稱。
#include <unistd.h>
#include <filesystem>
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::filesystem::current_path;
int main() {
char tmp[256];
getcwd(tmp, 256);
cout << "Current working directory: " << tmp << endl;
return EXIT_SUCCESS;
}
輸出:
Current working directory: /tmp/projects
使用 std::filesystem::current_path
函式獲取當前目錄
std::filesystem::current_path
方法是 C++ 檔案系統庫的一部分,是現代編碼準則推薦的檢索當前目錄的方式。需要注意的是,filesystem
庫是在 C++17 版本之後加入的,要想使用下面的程式碼,需要相應版本的編譯器。
std::filesystem::current_path
在沒有任何引數的情況下,返回當前的工作目錄,可以直接輸出到控制檯。如果將目錄路徑傳遞給函式,則將當前目錄改為給定路徑。
#include <unistd.h>
#include <filesystem>
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::filesystem::current_path;
int main() {
cout << "Current working directory: " << current_path() << endl;
return EXIT_SUCCESS;
}
輸出:
Current working directory: /tmp/projects
使用 get_current_dir_name
函式獲取當前目錄
get_current_dir_name
是 C 庫函式,與前面的方法類似,只是在呼叫成功後返回 char*
,儲存當前工作目錄的路徑。get_current_dir_name
會自動分配足夠的動態記憶體來儲存路徑名,但呼叫者有責任在程式退出前釋放記憶體。
#include <unistd.h>
#include <filesystem>
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::filesystem::current_path;
int main() {
char *cwd = get_current_dir_name();
cout << "Current working directory: " << cwd << endl;
free(cwd);
return EXIT_SUCCESS;
}
輸出:
Current working directory: /tmp/projects
C++ 檔案系統庫的另一個有用的功能是 std::filesystem::directory_iterator
物件,它可以用來遍歷給定目錄路徑中的元素。注意,元素可以是檔案、符號連結、目錄或套接字,它們的迭代順序是不指定的。在下面的例子中,我們輸出當前工作目錄中每個元素的路徑名。
#include <unistd.h>
#include <filesystem>
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::filesystem::current_path;
using std::filesystem::directory_iterator;
int main() {
for (auto& p : directory_iterator("./")) cout << p.path() << '\n';
return EXIT_SUCCESS;
}
輸出:
"./main.cpp"
"./a.out"
作者: Jinku Hu