【C++17】std::filesystem::exists でファイルやディレクトリの存在を確認する方法

目次

はじめに

C++でファイルを開いたり、ディレクトリを作成したりする際、操作の前に「そのパスが本当に存在するか」を確認することは、エラーを未然に防ぐ上で非常に重要です。

C++17で導入された <filesystem> ライブラリは、この存在確認を簡単に行うための**std::filesystem::exists()**という関数を提供しています。この関数を使えば、ファイルやディレクトリの有無を、OSに依存しない移植性の高いコードで、シンプルに確認できます。


【前提】C++17とは?

C++17は、2017年に正式化されたC++言語の規格です。<filesystem> ライブラリはこのC++17で導入されたため、利用するにはC++17に対応したコンパイラと、適切なコンパイラ設定(および、一部の環境ではリンカ設定)が必要になります。


exists() を使ったサンプルコード

このコードは、まず存在しないファイルパスに対して exists() を実行し、次にファイルを作成してから再度 exists() を実行し、最後にファイルを削除した後の exists() の結果、という一連の流れで、関数の動作を確認します。

完成コード

#include <iostream>
#include <filesystem>
#include <fstream>    // ofstream

// filesystem名前空間のエイリアス
namespace fs = std::filesystem;

int main() {
    fs::path check_path = "temp_data.log";
    
    // 1. ファイル作成前の存在確認
    std::cout << "作成前: パス「" << check_path << "」は存在しますか? -> "
              << std::boolalpha << fs::exists(check_path) << std::endl;

    // 2. テスト用のファイルを作成
    std::ofstream temp_file(check_path);
    temp_file << "log data";
    temp_file.close();
    
    // 3. ファイル作成後の存在確認
    std::cout << "作成後: パス「" << check_path << "」は存在しますか? -> "
              << std::boolalpha << fs::exists(check_path) << std::endl;

    // 4. ファイルを削除
    fs::remove(check_path);

    // 5. ファイル削除後の存在確認
    std::cout << "削除後: パス「" << check_path << "」は存在しますか? -> "
              << std::boolalpha << fs::exists(check_path) << std::endl;
    
    return 0;
}

実行結果

作成前: パス「"temp_data.log"」は存在しますか? -> false
作成後: パス「"temp_data.log"」は存在しますか? -> true
削除後: パス「"temp_data.log"」は存在しますか? -> false

コードの解説

fs::exists(path)

  • 機能: 引数で渡された path が、ファイルシステム上にファイルまたはディレクトリとして存在するかどうかを判定します。
  • 戻り値:
    • 存在する場合 → true
    • 存在しない場合 → false
  • 引数: std::filesystem::path オブジェクトだけでなく、パスを表す文字列リテラル(例: "temp_data.log")を直接渡すこともできます。
  • エラー: exists() は、アクセス権の問題などでパスの状態を確認できない場合、filesystem_error 例外をスローすることがありますが、通常は false を返すため、比較的安全に呼び出せます。

まとめ

今回は、C++17の <filesystem> ライブラリを使って、ファイルやディレクトリの存在を安全に確認する exists() 関数について解説しました。

  • <filesystem> ヘッダーをインクルードする。
  • fs::exists(パス) の形で呼び出す。
  • 戻り値は**true / false**。

ファイルを開く前の存在チェックや、ディレクトリを作成する前の重複チェックなど、あらゆるファイル操作の基本となる関数です。

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

この記事を書いた人

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

目次