c++ 判断文件存在 filesystem

c++ 在有了filesystem这个库后也有了标准的判断方法不用再根据平台判断使用什么api了

参考链接:https://www.apiref.com/cpp-zh/cpp/filesystem/is_regular_file.html

#include <iostream>
#include <filesystem>

void checkFileType(std::filesystem::file_status status) {
  switch (status.type()) {
    case std::filesystem::file_type::block: printf("block"); break;
    case std::filesystem::file_type::character: printf("character"); break;
    case std::filesystem::file_type::directory: printf("directory"); break;
    case std::filesystem::file_type::fifo: printf("fifo"); break;
    case std::filesystem::file_type::none: printf("none"); break;
    case std::filesystem::file_type::not_found: printf("not_found"); break;
    case std::filesystem::file_type::regular: printf("regular"); break;
    case std::filesystem::file_type::socket: printf("socket"); break;
    case std::filesystem::file_type::symlink: printf("symlink"); break;
    case std::filesystem::file_type::unknown: printf("unknown"); break;
    default: break;
  }
  printf("\n");
}

int main (int argc, char *argv[]) {
  if (argc != 2) {
    printf("checkFileType.exe <filePath>\n");
    return 0;
  }
  std::filesystem::path path(argv[1]);
  checkFileType(std::filesystem::status(path));
  return 0;
}
#include <iostream>
#include <fstream>
#include <cstdio>
#include <cstring>
#include <filesystem>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <sys/stat.h>

namespace fs = std::filesystem;

void demo_status(const fs::path& p, fs::file_status s)
{
    std::cout << p;
    // 变体: switch(s.type()) { case fs::file_type::regular: ...}
    if(fs::is_regular_file(s)) std::cout << " is a regular file\n";
    if(fs::is_directory(s)) std::cout << " is a directory\n";
    if(fs::is_block_file(s)) std::cout << " is a block device\n";
    if(fs::is_character_file(s)) std::cout << " is a character device\n";
    if(fs::is_fifo(s)) std::cout << " is a named IPC pipe\n";
    if(fs::is_socket(s)) std::cout << " is a named IPC socket\n";
    if(fs::is_symlink(s)) std::cout << " is a symlink\n";
    if(!fs::exists(s)) std::cout << " does not exist\n";
}
int main()
{
    // 创建不同种类的文件
    fs::create_directory("sandbox");
    std::ofstream("sandbox/file"); // 创建常规文件
    fs::create_directory("sandbox/dir");
    mkfifo("sandbox/pipe", 0644);
    struct sockaddr_un addr;
    addr.sun_family = AF_UNIX;
    std::strcpy(addr.sun_path, "sandbox/sock");
    int fd = socket(PF_UNIX, SOCK_STREAM, 0);
    bind(fd, (struct sockaddr*)&addr, sizeof addr);
    fs::create_symlink("file", "sandbox/symlink");

    // 演示不同的状态访问器
    for(auto it = fs::directory_iterator("sandbox"); it != fs::directory_iterator(); ++it)
        demo_status(*it, it->symlink_status()); // 从 directory_entry 使用缓冲的状态
    demo_status("dev/null", fs::status("/dev/null")); // 直接调用 status
    demo_status("dev/sda", fs::status("/dev/sda"));
    demo_status("sandbox/no", fs::status("/sandbox/no"));

    // 清理
    close(fd);
    fs::remove_all("sandbox");
}
status
symlink_status

(C++17)
(C++17)

确定文件属性
确定文件属性,检查符号链接目标
(函数)
file_status

(C++17)

表示文件类型及权限
(类)
status_known

(C++17)

检查文件状态是否已知
(函数)
is_block_file

(C++17)

检查给定的路径是否表示块设备
(函数)
is_character_file

(C++17)

检查给定的路径是否表示字符设备
(函数)
is_directory

(C++17)

检查给定的路径是否表示一个目录
(函数)
is_fifo

(C++17)

检查给定的路径是否表示一个命名管道
(函数)
is_other

(C++17)

检查参数是否表示一个其他文件
(函数)
is_socket

(C++17)

检查参数是否表示一个具名 IPC 套接字
(函数)
is_symlink

(C++17)

检查参数是否表示一个符号链接
(函数)
exists

(C++17)

检查路径是否指代既存的文件系统对象
(函数)
is_regular_file

检查 directory_entry 是否代表常规文件
(std::filesystem::directory_entry 的公开成员函数)

文章目录