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

Pav*_*Dev 7 c++ portability c++17

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

我的程序解压缩了一个存档。该档案包含文件,目录和每个文件的创建时间。有了新的API,我有了一个可移植的solotution,用于创建目录(std::filesystem::create_directories),并且正在std::ofstream用于创建文件。

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

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

Nic*_*las 5

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

从最技术的意义上来说,答案是肯定的:std::filesystem::last_write_time 可以用来设置文件的最后一次写入时间

从更现实的意义上来说,答案不正确的原因是因为last_write_time以 astd::filesystem::file_time_type为时间。这是有问题的。

看,这个时间点的纪元(构成 0 时间的时间)是......实现定义的。它可能是 UNIX 时间(零是 1970 年 1 月 1 日 00:00:00)。或者可能是别的东西。

因为它是实现定义的,所以无法将对于某些已知纪元(例如,存档中的时间)的秒/分钟/天/等计数转换为std::filesystem::file_time_type,仅仅是因为您不这样做知道如何说话file_time_type。您真正可以做的唯一一件事就是使用现有的file_time_types 值并按任意时间计数调整它们(或通过 将其设置为当前时间file_time_type::clock::now())。但是您无法将文件的时间设置为某个已知的绝对日期/时间。

幸运的是,C++20 堵住了这个漏洞。system_clock将需要在 UNIX 时间上运行,并且file_time_type需要能够从/到任何可以转换为时间的类型进行std::chrono::clock_cast编辑system_clock

但在那之前,last_write_time它还没有应有的那么有用......