boost directory_iterator 是不是在 Windows 上按字母顺序访问文件和文件夹

Posted

技术标签:

【中文标题】boost directory_iterator 是不是在 Windows 上按字母顺序访问文件和文件夹【英文标题】: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 生成的结果不同。 【参考方案1】:

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

这些函数的documentation 声明:

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

【讨论】:

【参考方案2】:

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

reference 说:

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

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

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


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

【讨论】:

当我读到这篇文章时,我认为它是未指定的,因为基于操作系统文件系统的更改。这就是为什么我特别要求 Windows 的原因——因为据说 Linux 无法正常工作。 @MTLaurentys 不保证任何系统的链接文档。

以上是关于boost directory_iterator 是不是在 Windows 上按字母顺序访问文件和文件夹的主要内容,如果未能解决你的问题,请参考以下文章

boost directory_iterator 是不是在 Windows 上按字母顺序访问文件和文件夹

延迟打开的文件导致“打开的文件太多”

std::filesystem::directory_iterator 链接器问题(C++17)[重复]

`std :: filesystem :: directory_iterator`编译器问题

string::substr() 返回一个空字符串

Boost总结汇总