【问题标题】:Does boost directory_iterator visit files and folders in alphabetical order on Windowsboost directory_iterator 是否在 Windows 上按字母顺序访问文件和文件夹
【发布时间】:2018-08-17 15:55:03
【问题描述】:

我有一个文件夹 fold,其中包含子文件夹 sub1sub2...subX,其中包含 唯一 个文件。

假设我需要找到文件 X 的第一个匹配项。

我所需要的只是获得一个通过subXfold 迭代器,或者获得一个文件夹列表并自己对其进行排序。我运行了几次,我注意到迭代器确实按字母顺序排列,但是,我在文档中找不到它,所以这可能是巧合。但是我看到了:

Linux 列表未排序。那是因为目录迭代的顺序是未指定的。排序取决于底层操作系统 API 和文件系统细节。所以我们需要自己对结果进行排序。

  • Windows 上什么都没有(让我好奇)

编辑:fold 中的文件始终按字母顺序生成,以防发生任何更改...

问题:

我可以相信它总是会按顺序迭代吗? Windows 的“底层操作系统 API”是否指定了顺序?根据这篇文章:What order does the DIR command arrange files if no sort order is specified,我不这么认为。

【问题讨论】:

  • 即使当前的文件系统做到了,nextwork share 的可能性也小得多,而且操作系统的下一次迭代;好吧,所有的赌注都没有了。您是否期望超过一百万个子目录?如果没有,获取列表和排序将非常便宜。你会支持吗?首先,我假设您的规格是按字母顺序排列的吗?
  • 嗯...最多 5 个子目录。我明白你的意思。虽然它似乎在工作,但我无法确保它能够正常工作——或者 Windows 是否总是以相同的方式工作(如果这甚至是当前的方式)。谢谢
  • 请注意,Windows 默认使用 fancy sorting 的文件名,但 IIRC,可以在注册表中将其关闭。因此,正如 Yakk 所说,您不能假设特定的排序顺序。此外,例如,如果您只是调用std::sort,结果可能与Windows 使用StrCmpLogicalW 生成的结果不同。

标签: c++ windows boost


【解决方案1】:

boost::filesystem 将在 windows 上以FindFirstFileFindNextFile 的形式实现。

这些函数的documentation 声明:

搜索返回文件的顺序(例如字母顺序)无法保证,并且取决于文件系统。如果必须对数据进行排序,则应用程序必须在获得所有结果后进行排序。

【讨论】:

    【解决方案2】:

    我可以相信它总是会按顺序迭代吗?

    reference 说:

    未指定通过取消引用 directory_iterator 的连续增量获得的目录条目的顺序。

    因此,你永远不能相信它会按顺序迭代。

    如果您需要特定的顺序,则可以将条目存储到容器中,对其进行排序,然后迭代容器。


    PS。同样适用于std::filesystem::directory_iterator

    【讨论】:

    • 当我读到这篇文章时,我认为它是未指定的,因为基于操作系统文件系统的更改。这就是为什么我特别要求 Windows 的原因——因为据说 Linux 无法正常工作。
    • @MTLaurentys 不保证任何系统的链接文档。
    猜你喜欢
    • 2012-08-10
    • 1970-01-01
    • 2011-08-19
    • 2010-11-08
    • 2014-08-15
    • 2023-03-26
    • 2021-12-23
    • 2012-02-17
    • 1970-01-01
    相关资源
    最近更新 更多