名前空間
変種
操作

std::filesystem::exists

提供: cppreference.com
 
 
 
ヘッダ <filesystem> で定義
bool exists( std::filesystem::file_status s ) noexcept;
(1) (C++17以上)
bool exists( const std::filesystem::path& p );
bool exists( const std::filesystem::path& p, std::error_code& ec ) noexcept;
(2) (C++17以上)

指定されたファイルステータスまたはパスが、存在するファイルまたはディレクトリに対応するかどうか調べます。

1) status_known(s) && s.type() != file_type::not_found と同等です。
2) sstatus(p) または status(p, ec) によって行われたかのように決定される (シンボリックリンクを辿ります) std::filesystem::file_status としたとき、 exists(s) を返します。 例外を投げないオーバーロードは、 status_known(s) の場合、 ec.clear() を呼びます。

目次

[編集] 引数

s - 調べるファイルステータス
p - 調べるパス
ec - 例外を投げないオーバーロードでエラーを報告するための出力引数

[編集] 戻り値

指定されたパスまたはファイルステータスが存在するファイルまたはディレクトリに対応する場合は true、そうでなければ false

[編集] 例外

2) std::error_code& 引数を取らないオーバーロードは、ベースとなる OS の API でエラーが発生した場合、第1パス引数に p、エラーコード引数に OS のエラーコードを指定して構築された filesystem_error を投げます。 std::error_code& 引数を取るオーバーロードは、 OS の API 呼び出しが失敗した場合、その引数を OS の API のエラーコードに設定し、エラーが発生しない場合は ec.clear() を実行します。 noexcept 指定のないあらゆるオーバーロードは、メモリ確保に失敗した場合 std::bad_alloc を投げる可能性があります。

[編集] ノート

この関数によって提供される情報は、通常、ディレクトリイテレーションの副産物としても提供されます。 ディレクトリイテレーション中は、 exists(*iterator) の呼び出しは exists(iterator->status()) よりも非効率的です。

[編集]

#include <iostream>
#include <fstream>
#include <cstdint>
#include <filesystem>
namespace fs = std::filesystem;
 
void demo_exists(const fs::path& p, fs::file_status s = fs::file_status{})
{
    std::cout << p;
    if(fs::status_known(s) ? fs::exists(s) : fs::exists(p))
        std::cout << " exists\n";
    else
        std::cout << " does not exist\n";
}
int main()
{
    fs::create_directory("sandbox");
    std::ofstream("sandbox/file"); // create regular file
    fs::create_symlink("non-existing", "sandbox/symlink");
 
    demo_exists("sandbox");
    for(auto it = fs::directory_iterator("sandbox"); it != fs::directory_iterator(); ++it)
        demo_exists(*it, it->status()); // use cached status from directory entry
    fs::remove_all("sandbox");
}

出力:

"sandbox" exists
"sandbox/file" exists
"sandbox/symlink" does not exist

[編集] 関連項目

(C++17)(C++17)
ファイルの属性を調べます
シンボリックリンクのターゲットを確認しながらファイルの属性を調べます
(関数) [edit]
ファイル種別とパーミッションを表します
(クラス) [edit]
ディレクトリエントリが参照しているファイルシステムオブジェクトが存在しているかどうか調べます
(std::filesystem::directory_entryのパブリックメンバ関数) [edit]