【C++17】std::filesystemで現在の作業ディレクトリを取得・変更する方法

目次

はじめに

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(新しいパス): 現在の作業ディレクトリを変更する。

ファイルへの相対パスを扱う際など、プログラムの基準となるディレクトリを正確に把握・制御するために、この関数は非常に重要です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次