仅使用标准库设置文件创建时间

Set file creation time with standard library only

C++17 包含一个新的可移植的 API,用于处理文件系统 (<filesystem>)。

我的程序解压一个档案。此存档包含文件、目录和每个文件的创建时间。使用新的 API,我有一个用于创建目录的便携式解决方案 (std::filesystem::create_directories),并且我正在使用 std::ofstream 来创建文件。

我可以使用新的 API 设置文件创建(或修改)时间吗?

编辑:时间,由存档提供 - 它是秒,从 1970.01.01 开始 00:00:00(UNIX 纪元时间)

您问题的答案……很复杂。因为 C++ 必须是 C++。

从技术角度来说,答案是肯定的:std::filesystem::last_write_time can be used to set the last time of writing for the file.

之所以这个答案在更现实的意义上是不正确的,是因为last_write_time的时间是std::filesystem::file_time_type。这是有问题的。

看,这个时间点(0时间)的纪元是……implementation-defined。可能是 UNIX 时间(零是 1970 年 1 月 1 日 00:00:00)。或者它可能是别的东西。

因为它是 implementation-defined,所以无法便携地 将 seconds/minutes/days/etc 的计数相对于某个已知纪元(例如,你档案中的时间)变成 std::filesystem::file_time_type,只是因为你不会说话 file_time_type。您真正能做的唯一一件事就是使用现有的 file_time_types 值并按任意时间计数调整它们(或通过 file_time_type::clock::now() 将其设置为当前时间)。但是您不能将文件的时间设置为某个已知的绝对时间 date/time.

C++20幸运地堵住了这个坑。在 UNIX 时间 system_clock 将需要 运行,而 file_time_type 将需要能够 std::chrono::clock_casted from/to 任何可以转换为system_clock次。

但在那之前,last_write_time 并没有像它应该的那样有用...