目次
はじめに
C++で、プログラムが生成した一時ファイルや、空になったディレクトリを削除したい場合があります。
C++17で導入された <filesystem>
ライブラリは、このファイルシステムの削除操作を、OSに依存しない移植性の高いコードで簡単に行うための関数を提供しています。
std::filesystem::remove
: 単一のファイル、または空のディレクトリを削除する。std::filesystem::remove_all
: ディレクトリを、その中身ごと再帰的に削除する。
【前提】C++17とは?
C++17は、2017年に正式化されたC++言語の規格です。<filesystem>
ライブラリはこのC++17で導入されたため、利用するにはC++17に対応したコンパイラと、適切なコンパイラ設定(および、一部の環境ではリンカ設定)が必要になります。
ファイル・ディレクトリを削除するサンプルコード
このコードは、remove
と remove_all
の両方を使って、それぞれの挙動の違いを示します。
完成コード
#include <iostream>
#include <filesystem>
#include <fstream>
// filesystem名前空間のエイリアス
namespace fs = std::filesystem;
int main() {
// --- 1. remove: 単一のファイルを削除 ---
fs::path file_path = "temp_file.txt";
std::ofstream(file_path); // テストファイル作成
std::cout << "ファイル「" << file_path << "」を削除します..." << std::endl;
if (fs::remove(file_path)) {
std::cout << " -> 成功" << std::endl;
} else {
std::cout << " -> 失敗 (ファイルが存在しない等)" << std::endl;
}
// --- 2. remove: 空のディレクトリを削除 ---
fs::path empty_dir_path = "empty_dir";
fs::create_directory(empty_dir_path);
std::cout << "空のディレクトリ「" << empty_dir_path << "」を削除します..." << std::endl;
if (fs::remove(empty_dir_path)) {
std::cout << " -> 成功" << std::endl;
} else {
std::cout << " -> 失敗" << std::endl;
}
// --- 3. remove_all: 中身のあるディレクトリを削除 ---
fs::path non_empty_dir_path = "non_empty_dir";
fs::create_directories(non_empty_dir_path / "sub"); // サブディレクトリも作成
std::ofstream(non_empty_dir_path / "file.txt");
std::cout << "中身のあるディレクトリ「" << non_empty_dir_path << "」を削除します..." << std::endl;
// remove(non_empty_dir_path) は失敗するが、remove_allは成功する
uintmax_t removed_count = fs::remove_all(non_empty_dir_path);
std::cout << " -> 成功 (" << removed_count << "個のファイルを再帰的に削除しました)" << std::endl;
return 0;
}
コードの解説
1. fs::remove(path)
- 機能: 引数で渡された
path
が指す、単一のファイルまたは空のディレクトリを削除します。 - 戻り値:
- 削除に成功した場合 →
true
- 削除に失敗した場合(ファイルが存在しないなど) →
false
- 削除に成功した場合 →
- 【重要】: 中身が空でないディレクトリを削除しようとすると、操作は失敗し、エラー(例外)がスローされます。
2. fs::remove_all(path)
- 機能: 引数で渡された
path
がディレクトリの場合、そのディレクトリと、内部に含まれる全てのファイルやサブディレクトリを再帰的に削除します。 - 戻り値: 削除したファイルとディレクトリの総数を
uintmax_t
型で返します。 - 注意点: OSの「ごみ箱」には移動せず、完全に削除します。非常に強力なコマンドであるため、使用には注意が必要です。
まとめ
今回は、C++17の <filesystem>
ライブラリを使って、ファイルやディレクトリを削除する2つの方法を解説しました。
remove()
: ファイルや空のディレクトリを削除する場合に使う。remove_all()
: 中身ごとディレクトリを削除したい場合に使う(強力なので注意)。
これらの関数を使うことで、マクロが生成した一時ファイルや作業ディレクトリの後片付けを、OSに依存しない統一的なコードで安全に行うことができます。