【问题标题】:Get files in directory by modifying time通过修改时间获取目录中的文件
【发布时间】:2012-07-07 07:09:16
【问题描述】:

我想编写一个 C++ 函数,用目录中所有文件的文件名填充向量。此外,我希望这个向量按文件的最后修改时间排序。

我可以使用 boost::filesystem 读取目录中的所有文件并将其传递给向量,但是这些文件会通过文件名加载到向量中,然后我对文件进行统计并执行排序效率很高。

有人知道快速的方法吗?例如, ls -lhctr 几乎可以立即执行此操作,因此 C++ 对于大型目录也应该能够非常快速地执行此操作。

如果可能的话,我也希望它具有亚毫秒级的分辨率。

【问题讨论】:

  • 你提到了boost::filesystem——打电话给last_write_time有什么问题?
  • 即使您必须在之后执行排序,我怀疑在除了最庞大的目录之外的所有目录中都需要很长时间。我的第一个建议是,在尝试更复杂的东西之前,您可以使用 Boost 进行尝试,并确保它的速度不足以满足您的目的。你可能会发现这个解决方案已经足够好了。
  • boost版本不够快,对于700个文件的目录,大概需要2秒...
  • @user788171 它显示分析?
  • 我没有进行任何分析,我通过在函数调用前后的时间进行简单测试得到了这些数字。

标签: c++ sorting time


【解决方案1】:

也许map/multimap<std::time_t/dt::ptime, std::string/fs::path>

【讨论】:

【解决方案2】:

我知道在 Qt 的框架内有一个 QFileInfo 类将提供该信息。 http://doc.qt.nokia.com/4.7-snapshot/qfileinfo.html

我对 boost 不太熟悉,但我认为这应该类似:http://www.boost.org/doc/libs/1_32_0/libs/filesystem/doc/operations.htm#last_write_time

【讨论】:

    【解决方案3】:

    您可以使用 Boost.Filesystem 遍历目录,并在每个文件上调用 last_write_time()

    然后使用last_write_time 调用的结果作为键将文件名存储在std::multimap 中。这样在插入容器时会自动进行排序。

    【讨论】:

    • 我对 std::multimap 不是很熟悉,你能给出一个简短的代码示例以及一些关于为什么它更有效的更多细节,以便我尝试理解吗?提前致谢。
    • @user788171 我发布的链接很好地描述了multimap。基本上,它与std::map 相同,只是每个键可以有多个关联的值。因此,如果目录包含多个具有相同修改时间的文件,它们都可以存储在容器中。使用multimap 的好处是它是一个排序容器,当您插入一个值时,它会根据键值(在您的情况下为修改时间)和插入前的比较谓词进行排序。
    • 时间的时间分辨率是多少?它可以区分相隔 1 微秒创建的两个文件吗? 1毫秒怎么样?
    • @user788171 分辨率与std::time_t的类型和您平台的文件系统实现一样好。
    【解决方案4】:

    我并不是要开始伟大的 C++ system() 战斗,但您提到“ls -lhctr”几乎会立即返回您的答案,那么为什么不使用 system() 函数呢?试试:

    system("ls -lhctr > out.txt");

    然后使用 fstream 标头来 getline() 那个数据?

    当然,使用 system() 可以保证此解决方案不会移植到其他操作系统,但您可能并不关心这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-01
      • 2011-12-09
      • 1970-01-01
      • 2012-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多