【问题标题】:Get the last file name from std::filesystem::directory_iterator() without iteration?从 std::filesystem::directory_iterator() 获取最后一个文件名而不进行迭代?
【发布时间】:2020-12-10 23:07:46
【问题描述】:

我正在尝试获取最后一个文件名。 下面的代码非常优雅地完成了它。但它正在遍历目录中的所有文件。 是否可以不迭代得到最后一个文件?

#include <filesystem>
std::string latestFileName;
for (const auto &entry : fs::directory_iterator("/media/jai/Entertainment"))
      latestFileName = entry.path();
std::cout << latestFileName << std::endl;

已编辑:目录中的文件已按字母顺序递增。我想选择最新的文件,它肯定是按字母顺序排列的最后一个文件。由于可能有数百万个文件,我试图避免迭代。

【问题讨论】:

  • 通常迭代器是用来迭代的。您可以向随机访问迭代器添加数字,但您必须事先知道有多少文件,以便知道要添加什么。
  • 如果您只是想获得按字母顺序排序的列表的最后一个,则无法避免排序。操作系统根本不必以任何顺序存储文件,这意味着您使用的 API 必须进行排序,或者您必须进行排序。 std::filesystem::directory_iterator 不排序。这个boost example 展示了如何将路径复制到向量,然后使用std::sort() 对其进行排序。

标签: c++ c++17 std-filesystem


【解决方案1】:

恐怕这是不可能的,但这也不是一个好主意。这是一个坏主意,因为未指定迭代的顺序,并且您不能保证最后一个文件就是您想要的文件。这是不可能的,因为std::filesystem::directory_iterator 似乎在内部实现为单链表。

(通过 cppreference.com) 迭代顺序未指定,除了每个目录条目 只访问一次。

因此,访问最后一条路径不会获得任何价值。你的用例是什么?肯定有不同的方法可以完成您想做的事情。

【讨论】:

  • 感谢@theOtherMichael,我编辑了我的帖子以明确我的目标。
【解决方案2】:

正如@theOtherMichael 所建议的,在以下情况下无法避免排序 std::filesystem::directory_iterator.

考虑到我的目标,保持简单和快速。我选择执行以下步骤:

#include <filesystem>
std::string latestFileName;

for (const auto &entry : fs::directory_iterator("/media/jai/Entertainment")){
    if (entry.path() > latestFileName)  // ASCII compare
        latestFileName = entry.path();
          
std::cout << latestFileName << std::endl;

在我的例子中,文件名是数字(例如 20201106_115500_0-19399776.jpg)。我发现字符串比较可以完成这项工作。

【讨论】:

    猜你喜欢
    • 2021-01-17
    • 1970-01-01
    • 2019-02-27
    • 1970-01-01
    • 2015-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多