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 的公开成员函数)