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

时间:2019-06-16 01:00:14

标签: c++ c++17 portability

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

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

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

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

2 个答案:

答案 0 :(得分:3)

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

从技术上讲,答案是肯定的:std::filesystem::last_write_time can be used to set the last time of writing for the file

从更现实的意义上讲,答案不正确的原因是因为last_write_timestd::filesystem::file_time_type作为其时间。那是有问题的。

请参阅,此时间点的时间段(构成0时间)是...实现定义的。可能是UNIX时间(零是1970年1月1日,00:00:00)。或者可能是其他东西。

由于它是实现定义的,因此无法相对于某个已知纪元(例如,您的存档中的时间)便携式将秒/分钟/天/等计数)变成std::filesystem::file_time_type,只是因为您不知道如何说file_time_type。您唯一能做的就是使用现有的file_time_type值,并以任意时间计数来调整它们(或通过file_time_type::clock::now()将其设置为当前时间)。但是您不能将文件的时间设置为某个已知的绝对日期/时间。

C ++ 20幸运地堵了这个洞。 system_clock将需要在UNIX时间上运行,并且file_time_type将必须能够std::chrono::clock_casted到/可以转换为system_clock时间的任何类型

但是在那之前,last_write_time几乎没有应有的作用。

答案 1 :(得分:0)

因为必须是便携式

这很奇怪和无聊,但这仍然是事实。

恐怕您需要实现依赖于平台的预处理代码块。

#ifdef __WIN32
  #ifdef __WIN64
  #endif
#endif

#ifdef __unix__
#endif

#ifdef __<something>__
#endif

等等...不漂亮。

我发现您的问题极为重要,因为自OS / 2(甚至可能更早)以来,对所有 all 操作系统所支持的内容的支持就缺乏支持。假装它不存在是很荒谬的,但是您将不得不承受前几代人的思考而导致的后果,而新一代的标准化人员则非常谨慎/认真。