【代码讲解】【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++
C++ 语言异常处理实战:在编程潮流中坚守稳定,开启代码可靠之旅
【8月更文挑战第22天】C++的异常处理机制是确保程序稳定的关键特性。它允许程序在遇到错误时优雅地响应而非直接崩溃。通过`throw`抛出异常,并用`catch`捕获处理,可使程序控制流跳转至错误处理代码。例如,在进行除法运算或文件读取时,若发生除数为零或文件无法打开等错误,则可通过抛出异常并在调用处捕获来妥善处理这些情况。恰当使用异常处理能显著提升程序的健壮性和维护性。
76 2
|
4月前
|
算法框架/工具 C++ Python
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
249 0
|
17天前
|
算法 安全 C++
提高C/C++代码的可读性
提高C/C++代码的可读性
36 4
|
2月前
|
Linux C++
Linux c/c++文件的基本操作
在Linux环境下使用C/C++进行文件的基本操作,包括文件的创建、写入、读取、关闭以及文件描述符的定位。
20 0
Linux c/c++文件的基本操作
|
2月前
|
Linux C语言 C++
vsCode远程执行c和c++代码并操控linux服务器完整教程
这篇文章提供了一个完整的教程,介绍如何在Visual Studio Code中配置和使用插件来远程执行C和C++代码,并操控Linux服务器,包括安装VSCode、安装插件、配置插件、配置编译工具、升级glibc和编写代码进行调试的步骤。
279 0
vsCode远程执行c和c++代码并操控linux服务器完整教程
|
3月前
|
C++ 内存技术
[转]Visual C++内嵌swf文件并播放
[转]Visual C++内嵌swf文件并播放
|
2月前
|
Linux C++
Linux c/c++文件虚拟内存映射
这篇文章介绍了在Linux环境下,如何使用虚拟内存映射技术来提高文件读写的速度,并通过C/C++代码示例展示了文件映射的整个流程。
49 0
|
2月前
|
Linux C++
Linux c/c++文件移动
这篇文章介绍了在Linux环境下,使用C/C++语言通过命令方式和文件操作方式实现文件移动的方法。
70 0
|
3月前
|
C++
继续更新完善:C++ 结构体代码转MASM32代码
继续更新完善:C++ 结构体代码转MASM32代码
|
3月前
|
C++ Windows
HTML+JavaScript构建C++类代码一键转换MASM32代码平台
HTML+JavaScript构建C++类代码一键转换MASM32代码平台