C ++ 17包括一个新的可移植API,用于处理文件系统(<filesystem>
)。
我的程序解压缩一个档案。该档案包含文件,目录和每个文件的创建时间。有了新的API,我有了一个可移植的solotution来创建目录(std::filesystem::create_directories
),并且我正在使用std::ofstream
来创建文件。
我可以使用新的API来设置文件创建(或修改)时间吗?
编辑:时间,由归档提供的时间-秒,从1970.01.01 00:00:00(UNIX时代)开始
答案 0 :(得分:3)
您的问题的答案很复杂。因为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时间)是...实现定义的。可能是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_cast
ed到/可以转换为system_clock
时间的任何类型
但是在那之前,last_write_time
几乎没有应有的作用。
答案 1 :(得分:0)
因为必须是便携式:否
这很奇怪和无聊,但这仍然是事实。
恐怕您需要实现依赖于平台的预处理代码块。
#ifdef __WIN32
#ifdef __WIN64
#endif
#endif
#ifdef __unix__
#endif
#ifdef __<something>__
#endif
等等...不漂亮。
我发现您的问题极为重要,因为自OS / 2(甚至可能更早)以来,对所有 all 操作系统所支持的内容的支持就缺乏支持。假装它不存在是很荒谬的,但是您将不得不承受前几代人的思考而导致的后果,而新一代的标准化人员则非常谨慎/认真。