命名空间
变体
操作

std::filesystem::exists

来自 cppreference.com
 
 
 
定义在头文件 <filesystem>
bool exists( std::filesystem::file_status s ) noexcept;
(1) (自 C++17 起)
bool exists( const std::filesystem::path& p );
(2) (自 C++17 起)
bool exists( const std::filesystem::path& p, std::error_code& ec ) noexcept;
(3) (自 C++17 起)

检查给定的文件状态或路径是否对应于现有文件或目录。

1) 等效于 status_known(s) && s.type() != file_type::not_found.
2,3)s 为一个通过 status(p)status(p, ec)(分别遵循符号链接)确定的 std::filesystem::file_status。返回 exists(s)。如果 status_known(s),则无抛出重载调用 ec.clear().

内容

[编辑] 参数

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

[编辑] 返回值

如果给定的路径或文件状态对应于现有文件或目录,则返回 true,否则返回 false

[编辑] 异常

任何未标记为 noexcept 的重载都可能在内存分配失败时抛出 std::bad_alloc

2) 在底层操作系统 API 错误上抛出 std::filesystem::filesystem_error,以 p 作为第一个路径参数,操作系统错误代码作为错误代码参数构造。
3)std::error_code& 参数设置为操作系统 API 错误代码,如果操作系统 API 调用失败,并且如果未发生错误,则执行 ec.clear()

如果对象不存在,则不会抛出任何文件系统异常(使用返回值)。

[编辑] 备注

此函数提供的信息通常也作为目录迭代的副产品提供。在目录迭代期间,调用 exists(*iterator) 的效率不如 exists(iterator->status())

[编辑] 示例

#include <cstdint>
#include <filesystem>
#include <fstream>
#include <iostream>
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()
{
    const fs::path sandbox{"sandbox"};
    fs::create_directory(sandbox);
    std::ofstream{sandbox/"file"}; // create regular file
    fs::create_symlink("non-existing", sandbox/"symlink");
 
    demo_exists(sandbox);
 
    for (const auto& entry : fs::directory_iterator(sandbox))
        demo_exists(entry, entry.status()); // use cached status from directory entry
 
    fs::remove_all(sandbox);
}

输出

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

[编辑] 参见

(C++17)(C++17)
确定文件属性
确定文件属性,检查符号链接目标
(函数) [编辑]
表示文件类型和权限
(类) [编辑]
检查目录条目是否引用现有文件系统对象
(std::filesystem::directory_entry 的公有成员函数) [编辑]