在 C++ 中獲取當前目錄

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

本文將介紹幾種在 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
Jinku Hu avatar Jinku Hu avatar

DelftStack.com 創辦人。Jinku 在機器人和汽車行業工作了8多年。他在自動測試、遠端測試及從耐久性測試中創建報告時磨練了自己的程式設計技能。他擁有電氣/ 電子工程背景,但他也擴展了自己的興趣到嵌入式電子、嵌入式程式設計以及前端和後端程式設計。

LinkedIn Facebook

相關文章 - C++ Filesystem