C++界隈で約20年ダメプログラマをやっているまさじぃです。
今回は、C++でファイルを削除する方法です。
C++でファイルを削除する方法には、以下の2つがあります。
std::filesystem::remove
(C++17以降で使用可能)std::remove
他にOS依存の方法(WindowsのDeleteFile
やUnix系のunlink
)もありますが、私は汎用的なコードが大好きなので今回は除外します。
std::filesystem::remove (C++17以降)を使用
まずは、C++17以降で使用できる<filesystem>
ヘッダーのstd::filesystem::remove
関数です。
#include <filesystem>
#include <iostream>
int main() {
std::string file_name = "test_file.txt";
try {
if (std::filesystem::remove(file_name)) {
// ファイルが削除できた
std::cout << "File deleted [" << file_name << "]" << std::endl;
} else {
// ファイルが存在しなかった
std::cout << "File not exist [" << file_name << "]" << std::endl;
}
} catch (const std::filesystem::filesystem_error& e) {
// エラー発生
std::cerr << "Error!! " << e.what() << std::endl;
}
return 1;
}
std::filesystem::remove
は、ファイルが存在しない場合はfalse
を返します。
また、ファイルだけでなく、ディレクトリも削除することができます。ただし、ディレクトリ削除は空のディレクトリに限ります。
ディレクトリ内にファイルが残っている場合はstd::filesystem::remove_all
を使用します。
ファイルが存在しない場合は、false
を返しますが、以下のようにファイルの存在確認をしてから削除するのがスマートでしょう。
#include <filesystem>
#include <iostream>
int main() {
std::string file_name = "test_file.txt";
try {
if (std::filesystem::exists(file_name)) {
// ファイルが存在するので削除する
if (std::filesystem::remove(file_name)) {
std::cout << "File deleted [" << file_name << "]" << std::endl;
}
} else {
// ファイルが存在しない
std::cout << "File not exist [" << file_name << "]" << std::endl;
}
} catch (const std::filesystem::filesystem_error& e) {
// エラー発生
std::cerr << "Error!! " << e.what() << std::endl;
}
return 1;
}
std::removeを使用
C++標準ライブラリの<cstdio>
のstd::remove
を使用する方法です。
#include <cstdio>
#include <iostream>
int main() {
std::string file_name = "test_file.txt";
if (std::remove(file_name.c_str()) == 0) {
std::cout << "File deleted [" << file_name << "]" << std::endl;
} else {
std::cout << "削除失敗" << std::endl;
}
return 1;
}
削除失敗した場合、std::remove
は-1
を返します。
std::removeを使用してディレクトリ内のファイルを削除する
ディレクトリ内のファイルを全て削除したい事ってありますよね。
ディレクトリ内のファイルだけを削除します。ディレクトリ内のディレクトリは削除しません。
#include <iostream>
#include <cstdio>
#include <string>
#include <dirent.h>
#include <sys/stat.h>
#include <unistd.h>
int main() {
std::string path = "directory";
DIR* dir = opendir(path.c_str());
if (!dir) {
std::cout << "Directory Open Error!!" << std::endl;
return false;
}
struct dirent* entry;
while ((entry = readdir(dir)) != nullptr) {
std::string name = entry->d_name;
if (name == "." || name == "..") continue; // "." と ".." はスキップ
std::string full_path = path + "/" + name;
struct stat st;
if (stat(full_path.c_str(), &st) == 0) {
if (S_ISDIR(st.st_mode)) {
// サブディレクトリは削除の対象外
} else {
// ファイルを削除
if (std::remove(full_path.c_str()) == 0) {
// ファイル削除成功
std::cout << "File remove success!! : " << full_path << std::endl;
} else {
// ファイル削除失敗
std::cout << "File remove error!! : " << full_path << std::endl;
}
}
}
}
closedir(dir);
return 0;
}
C++でファイル削除 まとめ
C++でファイル削除する方法には、std::filesysmte::remove
やstd::remove
があります。
他にもOS依存の方法(WindowsではDeleteFile
関数、Unix系ではunlink
関数)もあります。
今回は、汎用性を求めて、std::filesysmte::remove
とstd::remove
を紹介しました。
必要なファイルを削除してしまっては大変なので、削除を実行する前に確認のプロセスを検討することも必要だと思います。