仅使用标准库设置文件创建时间
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_type
s 值并按任意时间计数调整它们(或通过 file_time_type::clock::now()
将其设置为当前时间)。但是您不能将文件的时间设置为某个已知的绝对时间 date/time.
C++20幸运地堵住了这个坑。在 UNIX 时间 system_clock
将需要 运行,而 file_time_type
将需要能够 std::chrono::clock_cast
ed from/to 任何可以转换为system_clock
次。
但在那之前,last_write_time
并没有像它应该的那样有用...
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_type
s 值并按任意时间计数调整它们(或通过 file_time_type::clock::now()
将其设置为当前时间)。但是您不能将文件的时间设置为某个已知的绝对时间 date/time.
C++20幸运地堵住了这个坑。在 UNIX 时间 system_clock
将需要 运行,而 file_time_type
将需要能够 std::chrono::clock_cast
ed from/to 任何可以转换为system_clock
次。
但在那之前,last_write_time
并没有像它应该的那样有用...