Namespaces
Variants

std::experimental::filesystem:: exists

From cppreference.net
定义于头文件 <experimental/filesystem>
bool exists ( file_status s )
(1) (filesystem TS)
bool exists ( const path & p ) ;
bool exists ( const path & p, error_code & ec )
(2) (filesystem TS)

检查给定的文件状态或路径是否对应存在的文件或目录。

1) 等价于 status_known ( s ) && s. type ( ) ! = file_type :: not_found
2) 等价于 exists ( status ( p ) ) exists ( status ( p, ec ) ) (符号链接会被跟踪)。非抛出重载在出现错误时返回 false

目录

参数

s - 要检查的文件状态
p - 要检查的路径
ec - 非抛出重载中用于错误报告的输出参数

返回值

true 如果给定路径或文件状态对应已存在的文件或目录, false 则表示其他情况。

异常

1)
noexcept 规范:
noexcept
2) 不接受 error_code & 参数的重载版本在底层操作系统 API 出错时会抛出 filesystem_error 异常,该异常以 p 作为第一参数,操作系统错误代码作为错误码参数构造。若内存分配失败则可能抛出 std:: bad_alloc 。接受 error_code & 参数的重载版本在操作系统 API 调用失败时将其设置为对应的错误码,若无错误发生则执行 ec. clear ( ) 。此重载版本具有
noexcept 规范:
noexcept

备注

该函数提供的信息通常也会作为目录迭代的副产品被获取。在目录迭代过程中,调用 exists(*iterator) 的效率低于调用 exists(iterator->status())

示例

#include <cstdint>
#include <experimental/filesystem>
#include <fstream>
#include <iostream>
namespace fs = std::experimental::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"); // 创建常规文件
    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()); // 使用目录条目中的缓存状态
    fs::remove_all("sandbox");
}

输出:

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

参见

确定文件属性
确定文件属性,检查符号链接目标
(函数)
表示文件类型和权限
(类)
此目录条目所指文件的缓存状态
此目录条目所指文件的缓存符号链接状态
( std::experimental::filesystem::directory_entry 的公开成员函数)