标准库标头 <filesystem> (C++17)学习

news2025/3/15 18:18:03

此头文件是文件系统支持库的一部分。本篇介绍filesystem命名空间的一些函数。

函数

在命名空间 std::filesystem 定义

absolute

(C++17)

组成一个绝对路径
(函数)

canonicalweakly_canonical

(C++17)

组成一个规范路径
(函数)

relativeproximate

(C++17)

组成一个相对路径
(函数)

copy

(C++17)

复制文件或目录
(函数)

copy_file

(C++17)

复制文件内容
(函数)

copy_symlink

(C++17)

复制一个符号链接
(函数)

create_directorycreate_directories

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

创建新目录
(函数)

create_hard_link

(C++17)

创建一个硬链接
(函数)

create_symlinkcreate_directory_symlink

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

创建一个符号链接
(函数)

current_path

(C++17)

返回或设置当前工作目录
(函数)

exists

(C++17)

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

equivalent

(C++17)

检查两个路径是否指代同一文件系统对象
(函数)

file_size

(C++17)

返回文件的大小
(函数)

hard_link_count

(C++17)

返回指代特定文件的硬链接数
(函数)

last_write_time

(C++17)

获取或设置最近一次数据修改的时间
(函数)

permissions

(C++17)

修改文件访问权限
(函数)

read_symlink

(C++17)

获得符号链接的目标
(函数)

removeremove_all

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

移除一个文件或空目录
移除一个文件或递归地移除一个目录及其所有内容
(函数)

rename

(C++17)

移动或重命名一个文件或目录
(函数)

resize_file

(C++17)

以截断或填充零更改一个常规文件的大小
(函数)

space

(C++17)

确定文件系统上的可用空闲空间
(函数)

statussymlink_status

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

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

temp_directory_path

(C++17)

返回一个适用于临时文件的目录
(函数)

 示例代码:

#include <filesystem>
#include <iostream>
#include <string>
#include <cstdlib>
#include <fstream>
#include <cstdint>
#include <system_error>

namespace fs = std::filesystem;

void show(std::filesystem::path x, std::filesystem::path y)
{
	std::cout << "x:\t\t " << x << "\ny:\t\t " << y << '\n'
		<< "relative(x, y):  "
		<< std::filesystem::relative(x, y) << '\n'
		<< "proximate(x, y): "
		<< std::filesystem::proximate(x, y) << "\n\n";
}

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";
}

struct HumanReadable
{
	std::uintmax_t size{};

private:
	friend std::ostream& operator<<(std::ostream& os, HumanReadable hr)
	{
		int o{};
		double mantissa = hr.size;
		for (; mantissa >= 1024.; mantissa /= 1024., ++o);
		os << std::ceil(mantissa * 10.) / 10. << "BKMGTPE"[o];
		return o ? os << "B (" << hr.size << ')' : os;
	}
};


int main(int, char const* argv[])
{
	//path current_path example  返回或设置当前工作目录 
	std::cout << "当前路径为 " << fs::current_path() << '\n';

	//path temp_directory_path example 返回一个适用于临时文件的目录 
	std::cout << "temp_directory_path " << fs::temp_directory_path() << '\n';
	//absolute example  当前路径/foo.c  组成一个绝对路径 
	std::filesystem::path p = "foo.c";
	std::cout << p << " 的绝对路径为 " << fs::absolute(p) << '\n';
	
	// create_directory/create_directories example 创建新目录 
	auto temp = fs::current_path();
	auto dir1 = temp / "abc";
	auto dir2 = temp / "abb/c2/e";
	std::filesystem::create_directory(dir1); //只能创建单个目录
	std::filesystem::create_directories(dir2);//可以创建多级目录
	std::filesystem::current_path(dir2);//设置当前路径

	// canonical/weakly_canonical  example 组成一个规范路径
	//"D:\\vscpp\\cpp20\\cpp20standard\\filesystem"
	auto p1 = std::filesystem::path("../../c2/./e");
	auto p2 = std::filesystem::path("../no-such-file");
	std::cout << "当前路径为 "
		<< std::filesystem::current_path() << '\n'
		<< p1 << " 的规范路径为 "
		<< std::filesystem::canonical(p1) << '\n'
		<< p2 << " 的弱规范路径为 "
		<< std::filesystem::weakly_canonical(p2) << '\n';

	try
	{
		[[maybe_unused]] auto x_x = std::filesystem::canonical(p2);
		// 不会抵达此处
	}
	catch (const std::exception& ex)
	{
		std::cout << p2 << " 的规范路径抛出了异常:\n"
			<< ex.what() << '\n';
	}
	//relative / proximate 组成一个相对路径 
	show("/a/b/c", "/a/b");
	show("/a/c", "/a/b");
	show("c", "/a/b");
	show("/a/b", "c");

	//auto temp = fs::current_path();
	auto dir3 = temp / "abb\\c2";
	auto dir4 = temp / "abb\\dir4";
	auto file1 = temp / "abb\\file1.txt";
	auto file2 = temp / "abb\\file2.txt";
	std::cout << "dir3======================" << dir3 << "\n";
	std::ofstream(file1).put('a');
	fs::copy(file1, file2); // 复制文件
	fs::copy(dir3, dir4); // 复制目录(非递归)
	const auto copyOptions = fs::copy_options::update_existing
		| fs::copy_options::recursive
		| fs::copy_options::directories_only
		;
	auto dirAbc = temp / "abc";
	auto dir5 = temp / "abb_copy";
	fs::copy(dirAbc, dir5, copyOptions);
	static_cast<void>(std::system("tree"));
	// remove/remove_all 移除一个文件或空目录 / 移除一个文件或递归地移除一个目录及其所有内容
	fs::remove(file1);
	fs::remove(file2);
	fs::remove_all(dirAbc);
	fs::remove_all(dir5);

	//exists example 检查路径是否指代既存的文件系统对象 
	const fs::path sandbox{ temp/"sandbox" };
	fs::create_directory(sandbox);
	std::ofstream{ sandbox / "file" }; // 创建常规文件
	//fs::create_symlink("non-existing", sandbox / "symlink");

	demo_exists(sandbox);

	for (const auto& entry : fs::directory_iterator(sandbox))
		demo_exists(entry, entry.status()); // 使用来自 directory_entry 的缓存状态

	fs::remove_all(sandbox);

	// 硬链接等价  equivalent example 检查两个路径是否指代同一文件系统对象 
	fs::path path1 = ".";
	fs::path path2 = fs::current_path();
	if (fs::equivalent(path1, path2))
		std::cout << path1 << " is equivalent to " << path2 << '\n';

	// 符号链接等价 
	for (const fs::path lib : {"/lib/libc.so.6", "/lib/x86_64-linux-gnu/libc.so.6"})
	{
		try
		{
			path2 = lib.parent_path() / fs::read_symlink(lib);
		}
		catch (std::filesystem::filesystem_error const& ex)
		{
			std::cout << ex.what() << '\n';
			continue;
		}

		if (fs::equivalent(lib, path2))
			std::cout << lib << " is equivalent to " << path2 << '\n';
	}
	//file_size example 返回文件的大小 
	fs::path example = "bug.nc";
	fs::path path3 = fs::current_path() / example;
	std::ofstream(path3).put('a'); // 创建大小为 1 的文件
	std::cout << example << " size = " << fs::file_size(path3) << '\n';
	fs::remove(path3);

	path3 = argv[0];
	std::cout << path3 << " size = " << HumanReadable{ fs::file_size(path3) } << '\n';

	try
	{
		std::cout << "尝试获取目录的大小:\n";
		[[maybe_unused]] auto x_x = fs::file_size("/dev");
	}
	catch (fs::filesystem_error& e)
	{
		std::cout << e.what() << '\n';
	}

	for (std::error_code ec; fs::path bin : {"cat", "mouse"})
	{
		bin = "/bin" / bin;
		if (const std::uintmax_t size = fs::file_size(bin, ec); ec)
			std::cout << bin << " : " << ec.message() << '\n';
		else
			std::cout << bin << " size = " << HumanReadable{ size } << '\n';
	}

	//rename example 移动或重命名一个文件或目录 
	std::filesystem::path path4 = std::filesystem::current_path() / "sandbox";
	std::filesystem::create_directories(path4 / "from");
	std::ofstream{ path4 / "from/file1.txt" }.put('a');
	std::filesystem::create_directory(path4 / "to");

	fs::rename(path4 / "from/file1.txt", path4 / "to/file2.txt"); // OK
//	fs::rename(path4 / "from", path4 / "to/subdir"); // OK

	//space example确定文件系统上的可用空闲空间
	std::error_code ec;
	const std::filesystem::space_info si = std::filesystem::space(path4, ec);
	std::cout << "capacity: " << si.capacity << "\tavailable:" << si.available << "\tfree:" << si.free << '\n';

	//std::filesystem::remove_all(path4);

	std::cout << "hello world\n";
	return 0;
}




运行结果:

参考:

标准库标头 <filesystem> (C++17) - cppreference.com

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

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

相关文章

提高开发效率的实用工具库VueUse

VueUse中文网&#xff1a;https://vueuse.nodejs.cn/ 使用方法 安装依赖包 npm i vueuse/core单页面使用&#xff08;useThrottleFn举例&#xff09; import { useThrottleFn } from "vueuse/core"; // 表单提交 const handleSubmit useThrottleFn(() > {// 具…

Android中Fragment的最佳实践—简易版的新闻应用

文章目录 Android中Fragment的最佳实践—简易版的新闻应用app/build.gradle当中添加依赖库新建新闻实体类News新建布局文件news_content_frag.xml新建NewsContentFragment类单页模式需新建NewsContentActivity新建news_title_frag.xml新建news_item.xml新建NewsTitleFragment修…

el-date-picker年份选择默认值为当前年,并且将获取时间转为年月日格式

<el-date-pickervalue-format"yyyy"v-model"leftQuery.year":disabled"timeArr && timeArr.length ! 0 ? true : false"type"year"placeholder"选择年"changechangeYear:picker-options"pickerOptions&quo…

Python GUI入门详解-学习篇

一、简介 GUI就是图形用户界面的意思&#xff0c;在Python中使用PyQt可以快速搭建自己的应用&#xff0c;自己的程序看上去就会更加高大上。 有时候使用 python 做自动化运维操作&#xff0c;开发一个简单的应用程序非常方便。程序写好&#xff0c;每次都要通过命令行运行 pyt…

第4章-03-用WebDriver获取页面Cookie

🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年CSDN全站百大博主。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。 🏆本文已收录于专栏:Web爬虫入门与实战精讲,后续完整更新内容如下。 文章…

IDEA提交git代码前执行checkstyle校验

为了统一团队人员代码风格&#xff0c;在代码协同时经常会引入对应的checkstyle校验功能&#xff0c;配置好代码style后一般在IDEA执行mvn validate功能即可&#xff0c;如下图所示&#xff1a; 但是有时忘记执行怎么办&#xff0c;IDEA在代码提交前也有对应的配置&#xff0c;…

【Java并发编程 | JUC】线程

Java 线程 项目配置 pom.xml <dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.10</version></dependency><dependency><groupId>ch.qos.…

orcle 数据库 day0903

ok奥家人们&#xff0c;今天继续学习orcle数据库 一. 数据完整性 向某张表插入数据、更新、删除数据之前会对数据做校验&#xff0c;目 的就是为了确保数据的正确性、一致性、最大限度 减少重复 的数据、避免脏数据&#xff0c;这就是数据完整性。以下的数据就是脏 数据&a…

表情,符号,数字,字母,加密和解密源码

表情&#xff0c;符号&#xff0c;数字&#xff0c;字母&#xff0c;加密和解密源码 可以将表情&#xff0c;动物&#xff0c;水果&#xff0c;表情&#xff0c;手势&#xff0c;猫语&#xff0c;兽语&#xff0c;狗语&#xff0c;爱语&#xff0c;符号&#xff0c;数字&#x…

Mac M1安装Hive

一、下载解压Hive 1.官网地址 https://dlcdn.apache.org/hive/ 2.选择对应版本进行下载&#xff0c;这里我以3.1.3为例&#xff1b; 3.下载好后&#xff0c;进行解压&#xff0c;并重命名为hive-3.1.3&#xff0c;放到资源库目录下&#xff1b; 二、配置系统环境 1.打开~/…

WebGL系列教程一(开篇)

目录 1 前言2 推荐的书籍和网站3 WebGL简介4 本教程包含的主要内容预览4.1 顶点着色器4.2 片元着色器4.3 绘制点线面4.4 绘制三角形和四边形4.5 缓冲区4.6 旋转、平移、缩放4.7 动画4.8 颜色和纹理4.9 GLSL语法4.10 模型变换、视图变换、投影变换4.11 光照4.12 层次模型4.13 鼠…

【MySQL】MySQL常用的数据类型——表的操作

前言&#xff1a; &#x1f31f;&#x1f31f;本期讲解关于MySQL常用数据类型&#xff0c;表的简单使用&#xff0c;希望能帮到屏幕前的你。 &#x1f308;上期博客在这里&#xff1a;http://t.csdnimg.cn/wwaqe &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondl…

传统CV算法——特征匹配算法

Brute-Force蛮力匹配 Brute-Force蛮力匹配是一种简单直接的模式识别方法&#xff0c;经常用于计算机视觉和数字图像处理领域中的特征匹配。该方法通过逐一比较目标图像中的所有特征点与源图像中的特征点来寻找最佳匹配。这种方法的主要步骤包括&#xff1a; 特征提取&#xff…

JAVA开源项目 图书个性化推荐系统 计算机毕业设计

本文项目编号 T 015 &#xff0c;文末自助获取源码 \color{red}{T015&#xff0c;文末自助获取源码} T015&#xff0c;文末自助获取源码 目录 一、系统介绍1.1 业务分析1.2 用例设计1.3 时序设计 二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究…

jmeter之循环控制器使用

一、循环控制器介绍及使用 循环控制器作用&#xff1a; 通过设置循环次数&#xff0c;来实现循环发送请求 位置&#xff1a;测试计划------>线程组(右键添加)------>逻辑控制器------>循环控制器 如图&#xff1a; 参数介绍&#xff1a; 循环次数&#xff1a;5 …

C语言11--特殊函数

静态函数 背景知识&#xff1a;普通函数都是跨文件可见的&#xff0c;即在文件 a.c 中定义的函数可以在 b.c 中使用。静态函数&#xff1a;只能在定义的文件内可见的函数&#xff0c;称为静态函数。 因此静态函数一般会被写在头文件中方便任何需要调用的文件直接包含即可作用&…

JavaScript 循环分支语句-dowhile循环

do/while 循环是 while 循环的变体。该循环会在检查条件是否为真之前执行一次代码块&#xff0c;然后如果条件为真的话&#xff0c;就会重复这个循环。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta htt…

Ansys Zemax | 什么是Sobol取样?

附件下载 联系工作人员获取附件 本文主要介绍了&#xff1a; 什么是Sobol取样&#xff1f; 和随机光线产生方法相比&#xff0c;Sobol取样有什么优点&#xff1f; Sobol取样有什么限制&#xff1f; 随机取样和Sobol取样模式 一个光源会在位置空间以及角度空间随机产生光…

前端常用工具网站分享:MemFire Cloud,懒人开发者的福音

你是否曾梦想过&#xff0c;有那么一款工具&#xff0c;能够让你像变魔术一样快速搭建起一个应用&#xff0c;而无需深陷复杂的后端搭建和接口开发的泥潭&#xff1f;今天&#xff0c;我要为你介绍的&#xff0c;就是这样一个神奇的存在——MemFire Cloud&#xff0c;一款专为懒…

1.C_数据结构_基本知识

相关名词 数据是什么&#xff1a; 数据即信息的载体&#xff0c;是能够输入到计算机中并且能够计算机识别、存储、处理的符号总称。这里的数据不一定是一个int型&#xff0c;也可能是一个语音、一个字符串或者其他的一些打包的内容。 数据元素是什么&#xff1a; 数据元素(…