目次
はじめに
C++で、マクロの実行結果を保存するための新しいフォルダを自動で作成したい、という場面はよくあります。
C++17で導入された <filesystem>
ライブラリは、このディレクトリ作成をOSに依存しない、移植性の高いコードで簡単に行うための関数を提供しています。
std::filesystem::create_directory
: 単一のディレクトリを作成する。std::filesystem::create_directories
: 複数階層のディレクトリを一度に作成する。
この記事では、これら2つの関数の使い方と違いを解説します。
【前提】C++17とは?
C++17は、2017年に正式化されたC++言語の規格です。<filesystem>
ライブラリはこのC++17で導入されたため、利用するにはC++17に対応したコンパイラと、適切なコンパイラ設定(および、一部の環境ではリンカ設定)が必要になります。
ディレクトリを作成するサンプルコード
このコードは、create_directory
と create_directories
の両方を使って、それぞれの挙動の違いを示します。
完成コード
#include <iostream>
#include <filesystem>
// filesystem名前空間のエイリアス
namespace fs = std::filesystem;
int main() {
// --- 1. create_directory: 単一のディレクトリを作成 ---
fs::path single_dir = "temp_dir_A";
std::cout << "--- create_directory のテスト ---" << std::endl;
// 親ディレクトリが存在しないため、"temp_dir_A/sub" の作成は失敗する
bool result1 = fs::create_directory(single_dir);
bool result2 = fs::create_directory(single_dir / "sub");
std::cout << "'" << single_dir << "' の作成に成功: " << std::boolalpha << result1 << std::endl;
std::cout << "'" << (single_dir / "sub") << "' の作成に成功: " << std::boolalpha << result2 << std::endl;
// --- 2. create_directories: 複数階層のディレクトリを一度に作成 ---
fs::path nested_dirs = "temp_dir_B/sub/deeper";
std::cout << "\n--- create_directories のテスト ---" << std::endl;
// 親ディレクトリ(temp_dir_B, sub)が存在しなくても、まとめて作成してくれる
bool result3 = fs::create_directories(nested_dirs);
std::cout << "'" << nested_dirs << "' の作成に成功: " << std::boolalpha << result3 << std::endl;
// --- 後片付け ---
fs::remove_all("temp_dir_A");
fs::remove_all("temp_dir_B");
return 0;
}
コードの解説
1. fs::create_directory(path)
- 機能: 引数で渡された
path
に、単一のディレクトリを作成します。 - 戻り値:
- ディレクトリが実際に作成された場合 →
true
- 既に存在していた場合 →
false
- ディレクトリが実際に作成された場合 →
- 注意点: 親ディレクトリが存在しないと、ディレクトリの作成に失敗し、エラー(例外)をスローします。例えば、
temp_dir_A
が存在しない状態でfs::create_directory("temp_dir_A/sub")
を実行すると失敗します。
2. fs::create_directories(path)
- 機能: 引数で渡された
path
に、複数階層のディレクトリを一度に作成します。 - 戻り値:
- 少なくとも一つのディレクトリが実際に作成された場合 →
true
- 全ての階層が既に存在していた場合 →
false
- 少なくとも一つのディレクトリが実際に作成された場合 →
- 特徴:
create_directory
との最大の違いは、途中の親ディレクトリが存在しない場合に、それらも全て自動で作成してくれる点です。"temp_dir_B/sub/deeper"
を指定すれば、temp_dir_B
とsub
も一緒に作成されます。
まとめ
今回は、C++17の <filesystem>
ライブラリを使って、ディレクトリを作成する2つの方法を解説しました。
create_directory
: 1階層だけのディレクトリを作成する場合に使う。create_directories
: 複数階層のディレクトリをまとめて作成したい場合に使う。
ほとんどの場合、create_directories
の方がより堅牢で便利です。「出力用のフォルダ output/logs
を作りたい」といった場面では、output
フォルダの存在を気にしなくて済む create_directories
を使うのが良いでしょう。