在 C++ 中獲取當前目錄

Jinku Hu 2023年1月30日 2020年12月31日
  1. 使用 getcwd 函式獲取當前目錄的方法
  2. 使用 std::filesystem::current_path 函式獲取當前目錄
  3. 使用 get_current_dir_name 函式獲取當前目錄
在 C++ 中獲取當前目錄

本文將介紹幾種在 C++ 中獲取當前目錄的方法。

使用 getcwd 函式獲取當前目錄的方法

getcwd 是一個相容 POSIX 的函式,在許多基於 Unix 的系統上都可以使用,它可以檢索當前的工作目錄。該函式需要兩個引數-第一個 char*緩衝區,其中存放目錄路徑名和緩衝區的大小。請注意,我們宣告 char 為固定長度的陣列,並分配 256 元素的緩衝區,作為一個隨機的例子。如果呼叫成功,可以通過訪問 char 緩衝區列印當前目錄的儲存名稱。

#include <iostream>
#include <string>
#include <filesystem>
#include <unistd.h>

using std::cout; using std::cin;
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 <iostream>
#include <string>
#include <filesystem>
#include <unistd.h>

using std::cout; using std::cin;
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 <iostream>
#include <string>
#include <filesystem>
#include <unistd.h>

using std::cout; using std::cin;
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 <iostream>
#include <string>
#include <filesystem>
#include <unistd.h>

using std::cout; using std::cin;
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"
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn

相關文章 - C++ Filesystem