【问题标题】:Set file creation time with standard library only仅使用标准库设置文件创建时间
【发布时间】:2019-06-16 01:00:14
【问题描述】:

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

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

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

编辑:时间,由存档提供 - 以秒为单位,从 1970.01.01 00:00:00(UNIX Epoch 时间)开始

【问题讨论】:

    标签: c++ c++17 portability


    【解决方案1】:

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

    从最技术意义上来说,答案是肯定的:std::filesystem::last_write_timecan 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_types 值并通过任意时间计数调整它们(或通过file_time_type::clock::now() 将其设置为当前时间)。但是您不能将文件的时间设置为某个已知的绝对日期/时间。

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

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

    【讨论】:

    • 如何获得时间点的实际纪元? (这可能是 1970.01.01 或其他)
    • @PavelDev:“我怎样才能得到时间点的实际纪元?”你不能(C++20 之前)。这就是为什么如果不使用特定于实现的代码就不能使用file_time_type。您必须查看每个实现的文档以了解其特定时钟代码的工作方式。任何时间点的纪元总是相同的:零。但是你需要获得相对于其他纪元的那个纪元,而 C++20 之前没有这种机制。
    猜你喜欢
    • 1970-01-01
    • 2015-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-01
    • 1970-01-01
    • 2012-01-15
    • 1970-01-01
    相关资源
    最近更新 更多