6

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

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

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

4

2 回答 2

3

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

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

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

于 2020-12-11T01:21:02.547 回答
0

正如@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)。我发现字符串比较可以完成这项工作。

于 2020-12-12T19:29:53.937 回答