std::filesystem::exists - cppreference.com
提供: cppreference.com
<tbody> </tbody>
| ヘッダ |
||
|
|
(1) | (C++17以上) |
|
|
(2) | (C++17以上) |
指定されたファイルステータスまたはパスが、存在するファイルまたはディレクトリに対応するかどうか調べます。
1) status_known(s) && s.type() != file_type::not_found と同等です。
2) s を status(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 のエラーコードを指定して構築された
を投げます。 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