【代码讲解】【C/C++】获取文件最后修改的时间(系统时间)

简介: 【代码讲解】【C/C++】获取文件最后修改的时间(系统时间)

获取文件最后修改的时间(系统时间)

一、功能代码

#include
#include
#include

int main() {
auto ftime = fs::last_write_time(filePath);
auto sctp = std::chrono::time_point_caststd::chrono::system_clock::duration(ftime - fs::file_time_type::clock::now() + std::chrono::system_clock::now());
time_t tt = std::chrono::system_clock::to_time_t(sctp);
std::cout << "Last write time as time_t: " << tt << std::endl;
return 0;
}

在这个示例中,我们首先获取当前时间的 time_point,然后使用 to_time_t 将其转换为 time_t 类型,并打印出来。

二、代码讲解

这段代码是C++17中 库与chrono库,用于获取文件的最后写入时间,并将其转换为 std::chrono::system_clock::time_point 类型,最终转换为 time_t 类型的值。下面是对代码的逐行解释:

2.1 fs::last_write_time

auto ftime = fs::last_write_time(filePath);

这行代码使用 std::filesystem 命名空间中的 last_write_time 函数获取指定 filePath 的最后写入时间。ftime 是一个 fs::file_time_type 类型的对象,它表示文件系统的最后写入时间。

2.2 将写入时间从文件系统时钟转换为系统时钟

auto sctp = std::chrono::time_point_cast<std::chrono::system_clock::duration>(ftime - fs::file_time_type::clock::now() + std::chrono::system_clock::now());

这行代码稍微复杂一些,让我们分解来看:

  • 获取时间偏差

ftime - fs::file_time_type::clock::now():这行代码计算 ftime 与文件系统时钟的当前时间之间的差异。由于 fs::file_time_type 可能与系统时钟不同,所以这里使用 fs::file_time_type::clock::now() 来获取文件系统时钟的当前时间。

  • 将文件系统时钟的时间转换为系统时钟的时间
  • std::chrono::system_clock::now():将上一步的结果加上系统时钟的当前时间,目的是将文件系统时钟的时间转换为系统时钟的时间。
  • 时间点转换

std::chrono::time_point_caststd::chrono::system_clock::duration(…):这是 std::chrono 命名空间中的一个函数,用于将时间点从一种持续时间转换为另一种持续时间。在这里,它将文件系统时钟的时间点转换为 std::chrono::system_clock 的时间点。


最终,sctp 是一个 std::chrono::system_clock::time_point 类型的对象,它表示文件的最后写入时间,但以系统时钟的时间点表示。


这段代码的目的是将文件的最后写入时间从文件系统时钟转换为系统时钟,以便能够使用 std::chrono 库的功能来处理时间点。这种转换在进行时间比较或计算时非常有用。

2.3 转换成系统时间

std::chrono::system_clock::to_time_t 是 C++ 标准库中 头文件提供的一个函数,它用于将 std::chrono::system_clock::time_point 类型的时间点转换为 time_t 类型。time_t 是一个在 头文件中定义的类型,用于表示自 1970 年 1 月 1 日以来的秒数。


std::chrono::system_clock::to_time_t 函数的用法和它的作用:

  • 用法

     time_t tt = std::chrono::system_clock::to_time_t(sctp);

      sctp 是一个 std::chrono::system_clock::time_point 类型的对象,表示一个具体的时间点。

  • 作用

      to_time_t 函数接受 sctp 作为参数,并将其转换为 time_t 类型的值,这个值是自 1970 年 1 月 1 日 00:00:00 UTC 至 sctp 表示的时间点的总秒数。

      这个转换非常有用,因为 time_t 类型是许多系统函数和库函数中常用的时间表示方式。例如,它可以用于 std::ctime 函数,将 time_t 转换为一个表示日期和时间的字符串。


请注意,std::chrono::system_clock::to_time_t 函数可能在某些情况下会抛出异常,如果 sctp 表示的时间点超出了 time_t 类型能够表示的范围。例如,如果 sctp 表示的时间早于 1970 年 1 月 1 日,或者晚于 time_t 类型的最大值(通常是 2038 年 1 月 19 日,取决于平台和编译器)。


三、完整代码

c++17 监控文件是否被修改

相关文章
|
4月前
|
C++ Windows
.NET Framework安装不成功,下载`NET Framework 3.5`文件,Microsoft Visual C++
.NET Framework常见问题及解决方案汇总,涵盖缺失组件、安装失败、错误代码等,提供多种修复方法,包括全能王DLL修复工具、微软官方运行库及命令行安装等,适用于Windows系统,解决应用程序无法运行问题。
322 3
|
2月前
|
C++ Windows
应用程序无法正常启动(0xc0000005)?C++报错0xC0000005如何解决?使命召唤17频频出现闪退,错误代码0xC0000005(0x0)
简介: 本文介绍了Windows应用程序出现错误代码0xc0000005的解决方法,该错误多由C++运行库配置不一致或内存访问越界引起。提供包括统一运行库配置、调试排查及安装Visual C++运行库等解决方案,并附有修复工具下载链接。
1061 1
|
9月前
|
存储 安全 C语言
C++ String揭秘:写高效代码的关键
在C++编程中,字符串操作是不可避免的一部分。从简单的字符串拼接到复杂的文本处理,C++的string类为开发者提供了一种更高效、灵活且安全的方式来管理和操作字符串。本文将从基础操作入手,逐步揭开C++ string类的奥秘,帮助你深入理解其内部机制,并学会如何在实际开发中充分发挥其性能和优势。
|
4月前
|
API 数据安全/隐私保护 C++
永久修改机器码工具, exe一机一码破解工具,软件机器码一键修改工具【c++代码】
程序实现了完整的机器码修改功能,包含进程查找、内存扫描、模式匹配和修改操作。代码使用
|
5月前
|
C++
爱心代码 C++
这段C++代码使用EasyX图形库生成动态爱心图案。程序通过数学公式绘制爱心形状,并以帧动画形式呈现渐变效果。运行时需安装EasyX库,教程链接:http://【EasyX图形库的安装和使用】https://www.bilibili.com/video/BV1Xv4y1p7z1。代码中定义了屏幕尺寸、颜色数组等参数,利用随机数与数学函数生成动态点位,模拟爱心扩散与收缩动画,最终实现流畅的视觉效果。
810 0
|
算法框架/工具 C++ Python
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
1242 0
|
10月前
|
存储 算法 安全
基于哈希表的文件共享平台 C++ 算法实现与分析
在数字化时代,文件共享平台不可或缺。本文探讨哈希表在文件共享中的应用,包括原理、优势及C++实现。哈希表通过键值对快速访问文件元数据(如文件名、大小、位置等),查找时间复杂度为O(1),显著提升查找速度和用户体验。代码示例展示了文件上传和搜索功能,实际应用中需解决哈希冲突、动态扩容和线程安全等问题,以优化性能。
|
算法 安全 C++
提高C/C++代码的可读性
提高C/C++代码的可读性
259 4
|
Linux C++
Linux c/c++文件的基本操作
在Linux环境下使用C/C++进行文件的基本操作,包括文件的创建、写入、读取、关闭以及文件描述符的定位。
179 0
Linux c/c++文件的基本操作
|
Linux C语言 C++
vsCode远程执行c和c++代码并操控linux服务器完整教程
这篇文章提供了一个完整的教程,介绍如何在Visual Studio Code中配置和使用插件来远程执行C和C++代码,并操控Linux服务器,包括安装VSCode、安装插件、配置插件、配置编译工具、升级glibc和编写代码进行调试的步骤。
2441 0
vsCode远程执行c和c++代码并操控linux服务器完整教程