【C++】ファイルを削除する方法

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::removestd::removeがあります。

他にもOS依存の方法(WindowsではDeleteFile関数、Unix系ではunlink関数)もあります。

今回は、汎用性を求めて、std::filesysmte::removestd::removeを紹介しました。

必要なファイルを削除してしまっては大変なので、削除を実行する前に確認のプロセスを検討することも必要だと思います。

スポンサーリンク

  • この記事を書いた人

まさじぃ

ダメプログラマ歴20年です。 プログラミング関連の事や、 自分で使って良かったもの等の紹介をメインにやっています。

-プログラミング
-