【问题标题】:Converting string representation of last modification time back to its type(std::filesystem::file_time_type)将上次修改时间的字符串表示形式转换回其类型(std::filesystem::file_time_type)
【发布时间】:2019-09-09 16:30:39
【问题描述】:

我制作了一个函数,它使用 C++ filesystem 模块来获取给定文件的最后修改时间,并将其转换为 std::string

std::string Helper::lastWriteTime(const std::string& itemName)
{
    std::filesystem::path file(itemName);
    auto time = std::filesystem::last_write_time(file);

    std::time_t cftime = decltype(time)::clock::to_time_t(time);

    return std::to_string(cftime);
}

但是,现在我想使用此字符串并将其用作另一种方法的参数 - 该方法转换字符串并根据字符串表示更改上次修改时间。倒序的方法不起作用,有没有办法实现?

为了接收文件的最后修改时间,我使用函数 std::filesystem::last_write_time,它适用于数据类型 std::filesystem::file_time_type

背景:需要字符串解释,因为我通过网络发送这些数据,然后在收到这个时间后我使用它并更改另一个文件的最后修改时间,以便它们具有相同的时间。

lastWriteTime 方法的示例输出: 1568045082

【问题讨论】:

  • 问题是——如何将包含整数的字符串转换为file_time_type
  • 基本上,是的。我的问题标题不合适吗?我认为这种方式更好,但可以改变它。
  • 您不能移植的可能性很大,因为您示例中的变量 time 是一些特定于实现的计时时间点,如果没有类型信息,那将很难回来。
  • 特别是如果您尝试在不同的系统上进行重建。
  • 在 C++20 中使用时钟转换和 to_stream/from_stream 支持会更容易。

标签: c++ filesystems c++17


【解决方案1】:

在 C++20 的完整日期/时间出现之前,除了存储它并将其与另一个 file_time_type 进行比较之外,您对 file_time_type 无能为力。您的to_time_t 技巧不可移植,因为file_time_type 不需要成为system_clock 时间。

如果您想存储一个表示file_time_type 的整数表示的字符串并将其转换回来,那么您应该直接获取时间的time_since_epoch().count(),而不是使用to_time_t 体操。您可以通过执行以下操作将整数转换回 file_time_type

unsigned long long int_val = ...;
using ft = std::filesystem::file_time_type;
auto the_time = ft(ft::duration(int_val));

当然,这仅在源和目标实现使用兼容的文件系统时钟时才有效。即使他们在相同的时期使用相同的时钟,他们的file_time_type::duration 也需要相同。

【讨论】:

  • 我同意这是 C++20 可用之前的最佳方法。使用这种方法需要注意的一件事是,您必须确保 ft::duration::period 在此转换的两端都是相同的类型。 IE。如果一台机器通过网络将此字符串发送到另一台机器,则两台机器必须同意ft::durationnanoseconds(或任何单位)。否则会出现运行时错误。
  • 感谢您的建议!会试一试!我有点失望,在 C++20 之前没有更简单的方法来处理这个问题。
  • 有点离题,关于这个想法的可移植性。据我了解,当我使用这些时间结构/方法时,我会失去可移植性吗?我是这些时间界面的新手,所以没想到即使使用 file_time_type 我在不同的机器上也会失去相同的行为。
  • file_time_type 的纪元没有(也不会)指定。使用 gcc 和 llvm 的时代可能是 1970 年,但在 Windows 上可能是 1601 年。 gcc 和 llvm 上的精度看起来像纳秒,在 Windows 100ns 上。我在猜测这些数字,它们目前还不是一成不变的。一旦知道给定平台的纪元和精度,转换纪元和精度就相对简单了。 C++20 将自动执行该任务。
  • 处理纪元差异的另一种方法是使用描述民用日历中时间点的字符串格式,而不是自纪元以来的持续时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-27
  • 1970-01-01
相关资源
最近更新 更多