C++17中std::filesystem::directory_entry的使用

news2024/11/26 3:37:54

      C++17引入了std::filesystem库(文件系统库, filesystem library)。这里整理下std::filesystem::directory_entry的使用。
      std::filesystem::directory_entry,目录项,获取文件属性。此directory_entry类主要用法包括:
      (1).构造函数、operator=、assign:赋值;
      (2).replace_filename: 更改目录项的文件名;
      (3).path: 返回std::filesystem::path对象;
      (4).exists: 检查指定的目录项是否存在
      (5).is_block_file、is_character_file: 检查目录项是否是块设备(block device)、字符设备(character device);
      (6).is_directory: 检查目录项是否是目录;
      (7).is_fifo: 检查目录项是否是命令管道;
      (8).is_other: 检查目录项是否是其它文件(不是常规文件、目录或符号链接);
      (9).is_regular_file: 检查目录项是否是常规文件;
      (10).is_socket: 检查目录项是否是命名套接字;
      (11).is_symlink: 检查目录项是否是符号链接;
      (12).file_size: 获取目录项指定的文件大小
      (13).last_write_time:获取目录项最后修改时间

      以下为测试代码:注意windows和linux结果输出的差异

namespace {

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

std::string to_time_t(std::filesystem::file_time_type tp)
{
	using namespace std::chrono;
	auto sctp = time_point_cast<system_clock::duration>(tp - std::filesystem::file_time_type::clock::now() + system_clock::now());
	auto tt = system_clock::to_time_t(sctp);

	std::tm* gmt = std::localtime(&tt); // UTC: std::gmtime(&tt);
	std::stringstream buffer;
	buffer << std::put_time(gmt, "%Y-%m-%d %H:%M:%S");
	return buffer.str();
}

} // namespace

int test_filesystem_directory_entry()
{
	namespace fs = std::filesystem;

	// 1. construct,operator=,assign
	fs::directory_entry d1{ fs::current_path() };
	fs::directory_entry d2 = d1;
	fs::directory_entry d3;
	d3.assign(fs::current_path());
	if ((d1 == d2) && (d1 == d3))
		std::cout << "they are equal" << std::endl; // they are equal
	// windows: d1:"E:\\GitCode\\Messy_Test\\prj\\x86_x64_vc12\\CppBaseTest"
	// linux: d1:"/home/spring/GitCode/Messy_Test/prj/linux_cmake_CppBaseTest"
	std::cout << "d1:" << d1 << std::endl;

	// 2. replace_filename
	d1.replace_filename("C++17Test");
	// windows: d1:"E:\\GitCode\\Messy_Test\\prj\\x86_x64_vc12\\C++17Test"
	// linux: d1:"/home/spring/GitCode/Messy_Test/prj/C++17Test"
	std::cout << "d1:" << d1 << std::endl;

	// 3. path
	fs::path p1 = d1.path();
	// windows: p1:"E:\\GitCode\\Messy_Test\\prj\\x86_x64_vc12\\C++17Test"
	// linux: p1:"/home/spring/GitCode/Messy_Test/prj/C++17Test"
	std::cout << "p1:" << p1 << std::endl;

	// 4. exists
	for (const auto& str : { "C:\\Program Files (x86)", "/usr/local" , "E:\\GitCode\\xxx", "/usr/xxx"}) {
		fs::directory_entry entry{ str };
		/* windows:
			directory entry: "C:\\Program Files (x86)":exists
			directory entry: "/usr/local":does not exist
			directory entry: "E:\\GitCode\\xxx":does not exist
			directory entry: "/usr/xxx":does not exist */
		/* linux:
			directory entry: "C:\\Program Files (x86)":does not exist
			directory entry: "/usr/local":exists
			directory entry: "E:\\GitCode\\xxx":does not exist
			directory entry: "/usr/xxx":does not exist
		*/
		std::cout << "directory entry: " << entry << (entry.exists() ? ":exists\n" : ":does not exist\n");
	}

	// 5. is_block_file,is_character_file,is_directory,is_fifo,is_other,is_regular_file,is_socket,is_symlink
	for (const auto& str : { "/dev/null", "C:\\Program Files (x86)", "/usr/include/time.h", "C:\\MinGW\\bin\\c++filt.exe",
		"/usr/bin/g++", "/dev/block/11:0"}) {
		fs::directory_entry entry{ str };
		/* windows:
			"C:\\Program Files (x86)" is a directory
			"C:\\MinGW\\bin\\c++filt.exe" is a regular_file */
		/* linux:
			"/dev/null" is a character device
			"/dev/null" is an other file
			"/usr/include/time.h" is a regular_file
			"/usr/bin/g++" is a regular_file
			"/usr/bin/g++" is a symlink
			"/dev/block/11:0" is a block device
			"/dev/block/11:0" is an other file
			"/dev/block/11:0" is a symlink */
		if (entry.is_block_file())
			std::cout << entry << " is a block device" << std::endl;
		if (entry.is_character_file())
			std::cout << entry << " is a character device" << std::endl;
		if (entry.is_directory())
			std::cout << entry << " is a directory" << std::endl;
		if (entry.is_fifo())
			std::cout << entry << " is a FIFO" << std::endl;
		if (entry.is_other())
			std::cout << entry << " is an other file" << std::endl;
		if (entry.is_regular_file())
			std::cout << entry << " is a regular_file" << std::endl;
		if (entry.is_socket())
			std::cout << entry << " is a named socket" << std::endl;
		if (entry.is_symlink())
			std::cout << entry << " is a symlink" << std::endl;
	}

	// 6. file_size, last_write_time
	for (const auto& str : { "/usr/bin/g++", "D:\\FSCapture.exe", "D:\\DownLoad\\tmp.txt", "/usr/bin/cmake", "E:\\yulong.mp4"}) {
		fs::directory_entry entry{ str };
		/* windows:
			"D:\\FSCapture.exe" size: 2.82 MB
			"D:\\FSCapture.exe" last write time: 2016-03-29 09:26:26
			"D:\\DownLoad\\tmp.txt" size: 10 Bytes
			"D:\\DownLoad\\tmp.txt" last write time: 2023-09-26 09:00:35
			"E:\\yulong.mp4" size: 1.35 GB
			"E:\\yulong.mp4" last write time: 2023-08-19 22:42:56 */
		/* linux:
			"/usr/bin/g++" size: 910.82 KB
			"/usr/bin/g++" last write time: 2023-05-13 15:52:47
			"/usr/bin/cmake" size: 6.43 MB
			"/usr/bin/cmake" last write time: 2022-08-17 18:44:05 */
		if (entry.is_regular_file()) {
			std::string suffix;
			auto value = get_file_size(entry.file_size(), suffix);
			if (suffix == " Bytes")
				std::cout << entry << " size: " << static_cast<int>(value) << suffix << std::endl;
			else
				std::cout << entry << " size: " << std::fixed << std::setprecision(2) << value << suffix << std::endl;

			std::cout << entry << " last write time: " << to_time_t(entry.last_write_time()) << std::endl;
		}
	}

	return 0;
}

      执行结果如下图所示:

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

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

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

相关文章

28271-2012 米制超细牙螺纹 公差

声明 本文是学习GB-T 28271-2012 米制超细牙螺纹 公差. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了米制超细牙螺纹的公差和标记。 本标准适用于精密仪器和电子设备等领域的螺纹连接。 2 规范性引用文件 下列文件对于本文件…

BUUCTF reverse wp 65 - 70

[SWPU2019]ReverseMe 反编译的伪码看不明白, 直接动调 这里显示"Please input your flag", 然后接受输入, 再和32进行比较, 应该是flag长度要求32位, 符合要求则跳转到loc_E528EE分支继续执行 动调之后伪码可以读了 int __cdecl main(int argc, const char **arg…

差分运算放大器的放大倍数的计算及结论

由于虚断&#xff0c;流入V的电流几乎为0&#xff0c;根据分压定理可得&#xff1a; 同理&#xff0c;在V-处有&#xff1a; 由于虚短&#xff0c;可得&#xff1a; 化简可得&#xff1a; 其中&#xff1a; 称为正相放大倍数 称为反相放大倍数

学信息系统项目管理师第4版系列14_沟通管理

1. 与IT项目成功有关的最重要的四个因素 1.1. 主管层的支持 1.2. 用户参与 1.3. 有经验的项目经理 1.4. 清晰的业务目标 1.5. 依赖于项目经理和团队具有良好的沟通能力 2. 沟通的主旨 2.1. 互动双方建立彼此相互了解的关系 2.2. 相互回应 2.3. 期待能经由沟通的行为与…

计算机图像处理-中值滤波

非线性滤波 非线性滤波是利用原始图像跟模版之间的一种逻辑关系得到结果&#xff0c;常用的非线性滤波方法有中值滤波和高斯双边滤波&#xff0c;分别对应cv2.medianBlur(src, ksize)方法和cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace[, dst[, borderType]])方法。 …

【算法分析与设计】贪心算法(上)

目录 一、学习要点二、找硬币问题2.1 概述 三、活动安排问题3.1 策略选择3.2 活动安排问题程序代码3.3 一般使用数学归纳法进行证明3.4 活动选择算法的命题3.4.1 先看k1时是否正确3.4.2 归纳步骤&#xff0c;k->k13.4.3 归纳步骤&#xff08;续&#xff09; 四、贪心算法的基…

28385-2012 印刷机械 锁线机 学习笔记

声明 本文是学习GB-T 28385-2012 印刷机械 锁线机. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了锁线机的型式、基本参数、要求、试验方法、检验规则、标志、包装、运输与贮存。 本标准适用于用线将书帖装订成书芯的锁线机。 …

第四十三章 持久对象和SQL - 查看存储的数据

文章目录 第四十三章 持久对象和SQL - 查看存储的数据查看存储的数据SQL 生成代码的存储 第四十三章 持久对象和SQL - 查看存储的数据 查看存储的数据 本节演示对于任何持久对象&#xff0c;相同的值通过对象访问、SQL 访问和直接Global访问都是可见的。 在我们的 IDE 中&am…

信息安全第四周

社会工程学 社会工程学主要研究如何操纵人的心理和情感来获取机密信息或其他目标。它主要不是通过技术手段攻击计算机系统&#xff0c;而是通过心理学和人际交往技巧来欺骗人&#xff0c;使他们泄露密码、安全代码或其他敏感信息。社会工程学主要是一种安全风险&#xff0c;主要…

Ubuntu部署运行ORB-SLAM2

ORB-SLAM2是特征点法的视觉SLAM集大成者&#xff0c;不夸张地说是必学代码。博主已经多次部署运行与ORB-SLAM2相关的代码&#xff0c;所以对环境和依赖很熟悉&#xff0c;对整个系统也是学习了几个月&#xff0c;一行行代码理解。本次在工控机上部署记录下完整的流程。 ORB-SLA…

计算机图像处理-高斯滤波

高斯滤波 高斯滤波是一种线性平滑滤波&#xff0c;适用于消除高斯噪声&#xff0c;广泛应用于图像处理的减噪过程。通俗的讲&#xff0c;高斯滤波就是对整幅图像进行加权平均的过程&#xff0c;每一个像素点的值&#xff0c;都由其本身和邻域内的其他像素值经过加权平均后得到…

gitee 远程仓库操作基础(二)

(1&#xff09;clone远端仓库,本地建立分支推送 (基于远程仓库版本库 本地建立分支开发新功能) git clone gitgitee.com:xxxxx/alsa_test.git git remote add origin gitgitee.com:xxxxx/alsa_test.git进入clone过后路径代码,查看本地分支,发现该项目远程仓库有很多分支 基于…

初级篇—第六章创建和管理表

文章目录 一条数据存储的过程常用的数据类型创建和管理数据库创建数据库使用数据库修改数据库创建表创建方式1例1例2 创建方式2 查看数据表结构修改表追加一个列修改一个列重命名一个列删除一个列修改表名 删除表清空表 MySQL8新特性—DDL的原子化练习 一条数据存储的过程 存储…

Ubuntu系统下使用apt-get安装Mysql8

记录一下在Ubuntu20.04 64位系统下面使用apt-get方式安装mysql8关系型数据库 Centos下使用yum安装Mysql8&#xff08;Mysql5.7&#xff09;以及常见的配置和使用 首先肯定是检查下当前Ubuntu系统是否已经安装过mysql数据库 一般拿到新的云服务器是没有安装的 rootmyw:~# whe…

【STM32 CubeMX】移植u8g2(一次成功)

文章目录 前言一、下载u8g2源文件二、复制和更改文件2.1 复制文件2.2 修改文件u8g2_d_setup文件u8g2_d_memory 三、编写oled.c和oled.h文件3.1 CubeMX配置I2C3.2 编写文件oled.holed.c 四、测试代码main函数测试代码 总结 前言 在本文中&#xff0c;我们将介绍如何在STM32上成…

【IDEA】maven项目添加模块时,webapp没有被标识,无法识别的解决方法

问题 新添加maven项目模块后&#xff0c;webapp目录未被标识&#xff0c;即没有小蓝点的图标显示。如下图 解决方法 点击“File”下的“Project Strucure”&#xff0c;在弹出的框中&#xff0c;选中“Modules”下的项目名称&#xff0c;也就是“demo1”&#xff0c;点击“…

从零手搓一个【消息队列】创建核心类, 数据库设计与实现

文章目录 一、创建核心类1, 交换机2, 交换机类型3, 队列4, 绑定5, 交换机转发 & 绑定规则6, 消息7, 消息属性 二、数据库设计1, 使用 SQLite2, 使用 MyBatis2.1, 创建 Interface2.2, 创建 xml 文件 三、硬盘管理 -- 数据库1, 创建 DataBaseManager 类2, init() 初始化数据库…

2023年中国新能源圆柱电池市场发展前景分析:新能源圆柱行业发展前景乐观向好[图]

新能源圆柱电池是指电芯由正极材料&#xff08;钴酸镍或锰酸锌&#xff09;、隔膜纸及电解液组成&#xff1b;外壳采用铝塑复合管材制成的以钢壳圆柱磷酸铁锂电池为主的新型锂电池。 圆柱电池分类 资料来源&#xff1a;共研产业咨询&#xff08;共研网&#xff09; 新能源圆柱…

2023年8月嵌入式项目开发专题总汇

一、前言 本文介绍基于嵌入式系统和C语言开发的系列项目。这些项目涵盖了多个领域&#xff0c;从自动化控制到游戏开发&#xff0c;从计算机网络到物联网应用。通过这些项目的开发过程&#xff0c;将深入探讨各种技术和解决方案&#xff0c;并分享相关经验和知识。 在本文中&…

如何面对失败

失败是常态&#xff0c;有时候甚至是“败败败败乃兵家常事”。那么如何定义失败&#xff0c;面对失败的恐惧源自哪里&#xff0c;如何克服失败的恐惧、以至于如何克服失败本身&#xff1f; 什么是失败&#xff1f; 《道德经》第二章有云&#xff1a;“有无相生&#xff0c;难易…