C++ で現在のディレクトリを取得

胡金庫 2023年10月12日
  1. カレントディレクトリを取得するには getcwd 関数を使用する
  2. 関数 std::filesystem::current_path を用いてカレントディレクトリを取得する
  3. 関数 get_current_dir_name を用いてカレントディレクトリを取得する
C++ で現在のディレクトリを取得

この記事では、C++ でカレントディレクトリを取得する方法をいくつか説明します。

カレントディレクトリを取得するには getcwd 関数を使用する

getcwd は POSIX に準拠した関数であり、多くの Unix ベースのシステムで利用可能であり、現在の作業ディレクトリを取得することができます。この関数は 2つのパラメータを取ります。任意の例として、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"
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C++ Filesystem