はじめに
C++でファイル操作を行う際、プログラムが現在どのディレクトリを基準に動作しているか、つまり「現在の作業ディレクトリ(カレントディレクトリ)」を知りたい、あるいは変更したい場面があります。
C++17で導入された <filesystem>
ライブラリは、この現在の作業ディレクトリを扱うための**std::filesystem::current_path()
という関数を提供しています。この関数はオーバーロードされており、引数なしで呼び出せば取得**、引数を渡せば変更という、2つの役割を果たします。
【前提】C++17とは?
C++17は、2017年に正式化されたC++言語の規格です。<filesystem>
ライブラリはこのC++17で導入されたため、利用するにはC++17に対応したコンパイラと、適切なコンパイラ設定(および、一部の環境ではリンカ設定)が必要になります。
current_path()
を使ったサンプルコード
このコードは、まず現在の作業ディレクトリを取得して表示し、次にそれを一つ上の階層に変更し、再度取得して表示することで、ディレクトリが変更されたことを確認します。
完成コード
#include <iostream>
#include <filesystem>
// filesystem名前空間のエイリアス
namespace fs = std::filesystem;
int main() {
try {
// 1. 現在の作業ディレクトリを取得
fs::path initial_path = fs::current_path();
std::cout << "最初の作業ディレクトリ: " << initial_path << std::endl;
// 2. 現在の作業ディレクトリを変更 (一つ上の階層へ)
fs::current_path("..");
// 3. 変更後の作業ディレクトリを取得して表示
fs::path changed_path = fs::current_path();
std::cout << "変更後の作業ディレクトリ: " << changed_path << std::endl;
// 元のディレクトリに戻しておく
fs::current_path(initial_path);
} catch (const fs::filesystem_error& e) {
std::cerr << "エラーが発生しました: " << e.what() << std::endl;
}
return 0;
}
コードの解説
1. 現在の作業ディレクトリの取得
fs::path initial_path = fs::current_path();
current_path()
を引数なしで呼び出すと、現在の作業ディレクトリのパスをstd::filesystem::path
オブジェクトとして返します。
2. 現在の作業ディレクトリの変更
fs::current_path("..");
current_path()
にパスを表す文字列やpath
オブジェクトを引数として渡すと、現在の作業ディレクトリをそのパスに変更します。".."
は、一つ上の親ディレクトリを表す特別なパス名です。- 存在しないディレクトリを指定した場合など、変更に失敗すると
std::filesystem::filesystem_error
例外をスローする可能性があるため、try-catch
ブロックで囲んでおくと安全です。
まとめ
今回は、C++17の <filesystem>
ライブラリを使って、現在の作業ディレクトリを取得・変更する方法を解説しました。
fs::current_path()
(引数なし): 現在の作業ディレクトリを取得する。fs::current_path(新しいパス)
: 現在の作業ディレクトリを変更する。
ファイルへの相対パスを扱う際など、プログラムの基準となるディレクトリを正確に把握・制御するために、この関数は非常に重要です。