C++17中头文件filesystem的使用

news2024/12/23 8:51:47

      C++17引入了std::filesystem库(文件系统库, filesystem library),相关类及函数的声明在头文件filesystem中,命名空间为std::filesystem。

      1.path类:文件路径相关操作,如指定的路径是否存在等,其介绍参见:https://blog.csdn.net/fengbingchun/article/details/133217504
      2.directory_entry类:获取文件属性等,如指定文件是否是常规文件,还包括文件大小、文件最后修改时间,其介绍参见:https://blog.csdn.net/fengbingchun/article/details/133430293
      3.directory_iterator类:遍历目录,获取目录文件,不包括子目录,其介绍参见:https://blog.csdn.net/fengbingchun/article/details/133437356
      4.recursive_directory_iterator类:遍历目录,获取目录文件,包括子目录,其介绍参见:https://blog.csdn.net/fengbingchun/article/details/133437356
      5.filesystem_error类:异常类,继承自std::system_error,继承关系如下图所示:

      (1).path1, path2:返回存储在异常对象中的path;
      (2).what: 返回解释性字符串;
      (3).code: 返回错误码。

      测试代码如下所示:

int test_filesystem_filesystem_error()
{
	// path1, path2, whtat
	// creates a unique filename that does not name a currently existing file
	const fs::path oldp{ std::tmpnam(nullptr) }, newp{ std::tmpnam(nullptr) };

	/* windows:
		what():  rename: 系统找不到指定的文件。: "C:\Users\f06190\AppData\Local\Temp\sf2w.0", "C:\Users\f06190\AppData\Local\Temp\sf2w.1"
		path1(): "C:\\Users\\f06190\\AppData\\Local\\Temp\\sf2w.0"
		path2(): "C:\\Users\\f06190\\AppData\\Local\\Temp\\sf2w.1" */
	/* linux
		what():  filesystem error: cannot rename: No such file or directory [/tmp/filezJrUkO] [/tmp/filey7tqKV]
		path1(): "/tmp/filezJrUkO"
		path2(): "/tmp/filey7tqKV" */
	try {
		fs::rename(oldp, newp); // throws since oldp does not exist
	} catch (fs::filesystem_error const& ex) {
		std::cout << "what():  " << ex.what() << '\n'
			<< "path1(): " << ex.path1() << '\n'
			<< "path2(): " << ex.path2() << '\n';
	}

	return 0;
}

      6.file_status类:获取或设置有关文件类型(type)和权限(permissions)的信息
      (1).type: 获取或设置文件类型信息;
      (2).permissions: 获取或设置文件权限信息。

      测试代码如下所示:

void demo_status(const fs::path& p, fs::file_status s)
{
	std::cout << p;
	switch (s.type()) {
	case fs::file_type::none:
		std::cout << " has `not-evaluated-yet` type";
		break;
	case fs::file_type::not_found:
		std::cout << " does not exist";
		break;
	case fs::file_type::regular:
		std::cout << " is a regular file";
		break;
	case fs::file_type::directory:
		std::cout << " is a directory";
		break;
	case fs::file_type::symlink:
		std::cout << " is a symlink";
		break;
	case fs::file_type::block:
		std::cout << " is a block device";
		break;
	case fs::file_type::character:
		std::cout << " is a character device";
		break;
	case fs::file_type::fifo:
		std::cout << " is a named IPC pipe";
		break;
	case fs::file_type::socket:
		std::cout << " is a named IPC socket";
		break;
	case fs::file_type::unknown:
		std::cout << " has `unknown` type";
		break;
	default:
		std::cout << " has `implementation-defined` type";
		break;
	}
	std::cout << '\n';
}

void demo_perms(fs::perms p)
{
	using fs::perms;
	auto show = [=](char op, perms perm) {
		std::cout << (perms::none == (perm & p) ? '-' : op);
	};

	show('r', perms::owner_read);
	show('w', perms::owner_write);
	show('x', perms::owner_exec);
	show('r', perms::group_read);
	show('w', perms::group_write);
	show('x', perms::group_exec);
	show('r', perms::others_read);
	show('w', perms::others_write);
	show('x', perms::others_exec);
	std::cout << '\n';
}

int test_filesystem_file_status()
{
#ifdef _MSC_VER
	const std::string path{ "../../../testdata/list.txt" };
#else
	const std::string path{ "../../testdata/list.txt" };
#endif

	// 1. type
	// windows: "../../../testdata/list.txt" is a regular file
	// linux: "../../testdata/list.txt" is a regular file
	demo_status(path, fs::status(path));

	// 2. permissions
	demo_perms(fs::status(path).permissions()); // rwxrwxrwx

	return 0;
}

      7.space_info结构体:获取有关文件系统上的空闲(free)和可用空间(available space)的信息

struct space_info {
    std::uintmax_t capacity; // 总大小,以字节为单位
    std::uintmax_t free; // 可用空间,以字节为单位
    std::uintmax_t available; // 非特权进程可用的可用空间(可能等于或小于可用空间)
};
float get_file_size(std::uintmax_t size, std::string& suffix)
{
	float s1 = size / 1024. / 1024 / 1024;
	float s2 = size / 1024. / 1024;
	float s3 = size / 1024.;

	if (s1 > 1) {
		suffix = " GB";
		return s1;
	}
	if (s2 > 1) {
		suffix = " MB";
		return s2;
	}
	if (s3 > 1) {
		suffix = " KB";
		return s3;
	}
	suffix = " Bytes";
	return size;
}

int test_filesystem_space_info()
{
	fs::space_info info = fs::space(fs::current_path());
	std::cout << "current path: " << fs::current_path() << "  ";
	// windows: current path: "E:\\GitCode\\Messy_Test\\prj\\x86_x64_vc12\\CppBaseTest"   size: 311.00 GB   size: 189.23 GB   size: 189.23 GB
	// linux: current path: "/home/spring/GitCode/Messy_Test/prj/linux_cmake_CppBaseTest"   size: 311.00 GB   size: 189.23 GB   size: 189.23 GB
	for (auto x : { info.capacity, info.free, info.available }) {
		std::string suffix;
		auto value = get_file_size(static_cast<std::intmax_t>(x), suffix);
		std::cout << " size: " << std::fixed << std::setprecision(2) << value << suffix << "  ";
	}
	std::cout << std::endl;

	return 0;
}

      8.file_type枚举类:文件的类型

enum class file_type {
    none = /* unspecified */,
    not_found = /* unspecified */,
    regular = /* unspecified */,
    directory = /* unspecified */,
    symlink = /* unspecified */,
    block = /* unspecified */,
    character = /* unspecified */,
    fifo = /* unspecified */,
    socket = /* unspecified */,
    unknown = /* unspecified */,
    /* implementation-defined */
};

      9.perms枚举类:文件访问权限,如下图所示

      10.perm_options枚举类:控制函数std::filesystem::permissions()行为的可用选项,如下图所示:

enum class perm_options {
    replace = /* unspecified */,
    add = /* unspecified */,
    remove = /* unspecified */,
    nofollow = /* unspecified */
};

      11.非成员函数:
      (1).absolute:返回绝对路径;
      (2).canonical, weakly_canonical: 将指定路径转换为规范绝对路径(canonical absolute path),指定的路径必须存在;
      (3).relative, proximate: 返回相对路径;
      (4).copy: 拷贝文件或目录,会生成新的文件或目录,from指定的文件或目录必须存在,to指定的文件或目录必须不存在;
      (5).copy_file: 拷贝文件,会生成新的文件,from指定的文件必须存在,to指定的文件必须不存在;若发生错误,则返回false;
      (6).copy_symlink:拷贝符号链接;
      (7).create_directory, create_directories: 创建新目录,使用create_directory时要求父目录必须已存在,即create_directory不支持多级创建,而create_directories没有这些限制;
      (8).create_hard_link:创建硬链接;
      (9).create_symlink, create_directory_symlink: 创建符号链接;
      (10).current_path: 获取当前工作目录
      (11).exists: 检查指定的文件或目录是否存在
      (12).equivalent: 检查两个路径是否是相同的;
      (13).file_size: 获取文件大小
      (14).hard_link_count: 获取指定路径硬链接数;
      (15).last_write_time: 获取或设置指定路径最后一次修改时间
      (16).permissions: 修改文件访问权限;
      (17).read_symlink: 获取符号链接的target;
      (18).remove, remove_all:删除文件或空目录;remove_all可递归地删除文件或目录及其所有内容并返回已删除的文件和目录的数量;
      (19).rename: 重命名文件或目录
      (20).resize_file: 更改常规文件大小;
      (21).space: 获取指定的路径的可用空间
      (22).status, symlink_status: 获取文件属性,如指定路径是否是常规文件、是否是目录等;
      (23).temp_directory_path: 返回适合临时文件的目录
      std::error_code类是与平台相关的错误码。std::filesystem中的所有函数都有一个对应非抛出异常的对等接口

      测试代码如下所示:

int test_filesystem_non_member_functions()
{
	const fs::path p1 = "../funset.cpp";
#ifdef _MSC_VER
	const fs::path p2{ "../../../testdata/list.txt" }, p3{ "../../../testdata/list_copy.txt" }, p4{ "E:\\yulong.mp4" }, p5{ "../../../testdata/list_new.txt" };
#else
	const fs::path p2{ "../../testdata/list.txt" }, p3{ "../../testdata/list_copy.txt" }, p4{ "./build/CppBaseTest" }, p5{"../../testdata/list_new.txt"};
#endif
	// windows: current path is "E:\\GitCode\\Messy_Test\\prj\\x86_x64_vc12\\CppBaseTest"
	// linux: current path is "/home/spring/GitCode/Messy_Test/prj/linux_cmake_CppBaseTest"
	std::cout << "current path is " << fs::current_path() << '\n';
	// 1. absolute
	// windows: absolute path for "../funset.cpp" is "E:\\GitCode\\Messy_Test\\prj\\x86_x64_vc12\\funset.cpp"
	// linux: absolute path for "../funset.cpp" is "/home/spring/GitCode/Messy_Test/prj/linux_cmake_CppBaseTest/../funset.cpp"
	std::cout << "absolute path for " << p1 << " is " << fs::absolute(p1) << '\n';

	// 2. canonical, weakly_canonical
	/* windows:
		canonical path: "E:\\GitCode\\Messy_Test\\testdata\\list.txt"
		weakly canonical path: "E:\\GitCode\\Messy_Test\\testdata\\list.txt" */
	/* linux:
		canonical path: "/home/spring/GitCode/Messy_Test/testdata/list.txt"
		weakly canonical path: "/home/spring/GitCode/Messy_Test/testdata/list.txt" */
	std::cout << "canonical path: " << fs::canonical(p2) << "\n";
	std::cout << "weakly canonical path: " << fs::weakly_canonical(p2) << "\n";

	// 3. relative, proximate
	std::cout << "relative path: " << fs::relative("/a/b/c", "/a/b")
		<< ", proximat path: " << fs::proximate("/a/b/c", "/a/b") << "\n";	// relative path: "c", proximat path: "c"

	// 4. copy, exists, remove
	if (fs::exists(p3))
		fs::remove(p3);
	fs::copy(p2, p3);

	// 5. copy_file
	if (fs::exists(p3))
		fs::remove(p3);
	fs::copy_file(p2, p3);

	// 6. create_directory, create_directories
	fs::create_directory("./a");
	fs::create_directories("./b/c/d");

	// 7. equivalent
	if (fs::equivalent(".", fs::current_path()))
		std::cout << "they are equal" << "\n";

	// 8. file_size
	std::string suffix;
	auto value = get_file_size(static_cast<std::intmax_t>(fs::file_size(p4)), suffix);
	// windows: size: 1.35 GB; linux: size: 7.61 MB
	std::cout << "size: " << std::fixed << std::setprecision(2) << value << suffix << "\n";

	// 9. last_write_time
	// windows: last write time: 2023-08-19 22:42:56
	// linux: last write time: 2023-10-03 12:32:49
	std::cout << "last write time: " << to_time_t(last_write_time(p4)) << std::endl;

	// 10. permissions
	// windows: rwxrwxrwx r-xr-xr-x
	// linux:   rw-rw-r-- -w-r-----
	demo_perms(fs::status(p3).permissions());
#ifdef _MSC_VER
	fs::permissions(p3, fs::perms::none);
#else
	fs::permissions(p3, fs::perms::owner_write | fs::perms::group_read);
#endif
	demo_perms(fs::status(p3).permissions());

	// 11. rename
	if (fs::exists(p5))
		fs::remove(p5);
	fs::rename(p3, p5);

	// 12. resize_file
	// linux: size: 187.00 Bytes  size: 64.00 KB
	value = get_file_size(static_cast<std::intmax_t>(fs::file_size(p5)), suffix);
	std::cout << "size: " << std::fixed << std::setprecision(2) << value << suffix << "\n";
#ifdef __linux__
	fs::resize_file(p5, 64 * 1024); // resize to 64 KB, windows crash
	value = get_file_size(static_cast<std::intmax_t>(fs::file_size(p5)), suffix);
	std::cout << "size: " << std::fixed << std::setprecision(2) << value << suffix << "\n";
#endif

	// 13. temp_directory_path
	// windows: temp directory is: "C:\\Users\\f06190\\AppData\\Local\\Temp\\"
	// linux: temp directory is: "/tmp"
	std::cout << "temp directory is: " << fs::temp_directory_path() << "\n";

	// std::error_code
	std::error_code ec;
	fs::copy_file("xxx", "yyy", ec); // does not throw
	// windows: error code: 2,系统找不到指定的文件。
	// linux: error code: 2,No such file or directory
	std::cout << "error code: " << ec.value() << "," << ec.message() << "\n";

	try {
		fs::copy_file("xxx", "yyy");
	} catch (fs::filesystem_error const& ex) {
		std::cout << "what():  " << ex.what() << '\n'
			<< "path1(): " << ex.path1() << '\n'
			<< "path2(): " << ex.path2() << '\n'
			<< "code().value():    " << ex.code().value() << '\n'
			<< "code().message():  " << ex.code().message() << '\n'
			<< "code().category(): " << ex.code().category().name() << '\n';
	}

	return 0;
}

      执行结果如下图所示:

      12.文件类型:
      (1).is_block_file: 检查给定的文件或路径是否是块设备;
      (2).is_character_file: 检查给定的文件或路径是否是字符设备;
      (3).is_directory: 检查给定的文件或路径是否是目录
      (4).is_empty: 检查给定的文件或路径是否是空文件或空目录
      (5).is_fifo: 检查给定的文件或路径是否是命名管道;
      (6).is_other: 检查给定的文件或路径是否是其它文件;
      (7).is_regular_file: 检查给定的文件或路径是否是常规文件
      (8).is_socket: 检查给定的文件或路径是否是套接字;
      (9).is_symlink: 检查给定的文件或路径是否是符号链接;
      (10).status_known: 检查给定的文件是否已知。

      测试代码如下所示:

void demo_status2(const fs::path& p, fs::file_status s)
{
	std::cout << p;
	// alternative: 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";
	//if (fs::is_empty(p))
	//	std::cout << " is empty\n";
	if (fs::is_other(s)) // equivalent to exists(s) && !is_regular_file(s) && !is_directory(s) && !is_symlink(s)
		std::cout << " is other file\n";
	//if (fs::status_known(s)) // equivalent to s.type() != file_type::none
	//	std::cout << " is status known\n";
}

int test_filesystem_file_types()
{
	demo_status2("/dev/null", fs::status("/dev/null"));
	demo_status2("/dev/sda", fs::status("/dev/sda"));
	demo_status2(fs::current_path(), fs::status(fs::current_path()));
	demo_status2("/xxx/yyy", fs::status("/xxx/yyy"));
	demo_status2("/usr/bin/g++", fs::status("usr/bin/g++"));
	demo_status2("../../../testdata/list.txt", fs::status("../../../testdata/list.txt"));
	demo_status2("../../testdata/list.txt", fs::status("../../testdata/list.txt"));
	demo_status2("/mnt", fs::status("/mnt"));

	return 0;
}

      GitHub:https://github.com/fengbingchun/Messy_Test

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1059761.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32复习笔记(四):看门狗

目录 &#xff08;一&#xff09;简介 &#xff08;二&#xff09;IWDG IWDG的CUBEMX工程配置 IWDG相关函数&#xff08;非常少&#xff0c;所以直接贴上来&#xff09;&#xff1a; &#xff08;三&#xff09;WWDG &#xff08;一&#xff09;简介 看门狗分为独立看门…

【Java】微服务——Nacos注册中心

目录 1.Nacos快速入门1.1.服务注册到nacos1&#xff09;引入依赖2&#xff09;配置nacos地址3&#xff09;重启 2.服务分级存储模型2.1.给user-service配置集群2.2.同集群优先的负载均衡 3.权重配置4.环境隔离4.1.创建namespace4.2.给微服务配置namespace 5.Nacos与Eureka的区别…

[C++随想录] 优先级队列的模拟实现

优先级队列的模拟实现 底层结构初始化向下调整 && 向上调整push && poptop && empty && size源码 底层结构 namespace muyu {template <class T, class Continer std::vector<T>, class Compare less<T> >class priority_…

C#停车场管理系统

目录 一、绪论1.1内容简介及意义1.2开发工具及技术介绍 二、总体设计2.1系统总体架构2.2登录模块总体设计2.3主界面模块总体设计2.4停车证管理模块总体设计2.5停车位管理模块总体设计2.6员工管理模块总体设计2.7其他模块总体设计 三、详细设计3.1登录模块设计3.2主界面模块设计…

力扣:119. 杨辉三角 II(Python3)

题目&#xff1a; 给定一个非负索引 rowIndex&#xff0c;返回「杨辉三角」的第 rowIndex 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;力扣&#xff08;LeetCode&#xff09…

【Linux】ping命令详解

目录 一、ping概述 二、Ping用法 三、ping参数详解 四、使用 五、Wireshark抓取ICMP请求应答消息 一、ping概述 ping 命令用于测试与目标主机之间的连接。它向目标主机发送一个ICMP&#xff08;Internet Control Message Protocol&#xff09;Internet控制报文协议回显请求…

fetch前后端通信

fetch 前后端通信&#xff1a;ajax。 4步走&#xff1a; let xhrnew XMLHttpRequest() xhr.open(get,http://xxx) xhr.onreadystatechange xhr.send() 常用库&#xff1a; jQuery -> 回调地狱 axios fetch&#xff1a;网络获取资源 与Ajax的不同&#xff1a; 网络故障或请求…

激光雷达中实现F-P标准具高热稳定性的帕尔贴精密温控解决方案

摘要&#xff1a;法布里-珀罗标准具作为一种具有高温度敏感性的精密干涉分光器件&#xff0c;在具体应用中对热稳定性具有很高的要求&#xff0c;如温度波动不能超过0.01℃&#xff0c;为此本文提出了相应的高精度恒温控制解决方案。解决方案具体针对温度控制精度和温度均匀性控…

指针笔试题(带解析版)

题目2&#xff1a; struct MyStruct {int num;char* pcname;short sdate;char cha[2];short sba[4]; }*p; //结构体大小为32字节 //p0x100000 int main() {p 0x100000;printf("%p\n", p 0x1);//p&#xff1a;结构体指针&#xff0c;1下一个结构体指针&#xff0c;…

JVM-满老师

JVM 前言程序计数器&#xff0c;栈&#xff0c;虚拟机栈&#xff1a;本地方法栈&#xff1a;堆&#xff0c;方法区&#xff1a;堆内存溢出方法区运行时常量池 前言 JVM 可以理解的代码就叫做字节码&#xff08;即扩展名为 .class 的文件&#xff09;&#xff0c;它不面向任何特…

最新AI创作系统/AI绘画系统/ChatGPT系统+H5源码+微信公众号版+支持Prompt应用

一、AI创作系统 SparkAi创作系统是基于国外很火的ChatGPT进行开发的AI智能问答系统和AI绘画系统。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图…

Easyx图形库趣味编程note3,颜色模型

EasyX的文档中&#xff0c;不只有用大写字母的形式可绘制出的颜色&#xff0c;它支持更加缤纷多彩的颜色供我们使用。 RGB颜色模型 相信大家都知道三原色&#xff0c;小时候我们趴在电视机前&#xff0c;就可以很明显的发现电视上的色彩是由红绿蓝三种色彩构成&#xff0c;有这…

javascript: Sorting Algorithms

// Sorting Algorithms int JavaScript https://www.geeksforgeeks.org/sorting-algorithms/ /** * file Sort.js * 1. Bubble Sort冒泡排序法 * param arry * param nszie */ function BubbleSort(arry, nszie) {var i, j, temp;var swapped;for (i 0; i < nszie - 1; i)…

云原生微服务 第六章 Spring Cloud Netflix Eureka集成OpenFeign组件,实现微服务的远程调用、负载均衡

系列文章目录 第一章 Java线程池技术应用 第二章 CountDownLatch和Semaphone的应用 第三章 Spring Cloud 简介 第四章 Spring Cloud Netflix 之 Eureka 第五章 Spring Cloud Netflix 之 Ribbon 第六章 Spring Cloud 之 OpenFeign 文章目录 系列文章目录前言1、OpenFeign的实现…

httpserver 下载服务器demo 以及libevent版本的 httpserver

实现效果如下&#xff1a; 图片可以直接显示 cpp h 这些可以直接显示 其他的 则是提示是否要下载 单线程 还有bug 代码如下 先放上来 #include "httpserver.h" #include "stdio.h" #include <stdlib.h> #include <arpa/inet.h> #include…

SpringBoot中使用拦截器

拦截器属于MVC中的内容 SpringBoot项目,引入web依赖即可 需要访问的控制器 拦截器第一步实现HandlerInterceptor接口 第二步实现WebMvcConfigurer接口,并重写addInterCeptors()方法,将自定义的拦截器注册 也就是说这里add进去拦截的请求,才会进入到prehandle方法,这里放行的请…

嵌入式Linux应用开发-驱动大全-同步与互斥①

嵌入式Linux应用开发-驱动大全-同步与互斥① 第一章 同步与互斥①1.1 内联汇编1.1.1 C语言实现加法1.1.2 使用汇编函数实现加法1.1.3 内联汇编语法1.1.4 编写内联汇编实现加法1.1.5 earlyclobber的例子 1.2 同步与互斥的失败例子1.2.1 失败例子11.2.2 失败例子21.2.3 失败例子3…

AMD GPU 内核驱动分析(三)-dma-fence 同步工作模型

在Linux Kernel 的AMDGPU驱动实现中&#xff0c;dma-fence扮演着重要角色&#xff0c;AMDGPU的Render/解码操作可能涉及到多个方面同时引用buffer的情况&#xff0c;以渲染/视频解码场景为例&#xff0c;应用将渲染/解码命令写入和GPU共享的BUFFER之后&#xff0c;需要将任务提…

记录UNIAPP打包苹果iOS·APP

用到生成的四个文件:1-1.CSR证书文件、2-2.CER证书文件、3-3.PP文件【证书Profiles文件】、4-4.P12文件【证书私钥】 1. 生成CSR证书文件: 2. 操作苹果后台:Sign In - Applehttps://developer.apple.com/account/resources/certificates/list

高效的开发流程搭建

目录 1. 搭建 AI codebase 环境kaggle的服务器1. 搭建 AI codebase 环境 python 、torch 以及 cuda版本,对AI的影响最大。不同的版本,可能最终计算出的结果会有区别。 硬盘:PCIE转SSD的卡槽,, GPU: 软件源: Anaconda: 一定要放到固态硬盘上。 VS code 的 debug功能…