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
,其中包含子文件夹 sub1
、sub2
...subX
,其中包含 唯一 个文件。
假设我需要找到文件 X 的第一个匹配项。
我所需要的只是获得一个通过subX
的fold
迭代器,或者获得一个文件夹列表并自己对其进行排序。我运行了几次,我注意到迭代器确实按字母顺序排列,但是,我在文档中找不到它,所以这可能是巧合。但是我看到了:
Windows 上什么都没有(让我好奇)Linux 列表未排序。那是因为目录迭代的顺序是未指定的。排序取决于底层操作系统 API 和文件系统细节。所以我们需要自己对结果进行排序。
编辑: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 上以FindFirstFile
和FindNextFile
的形式实现。
这些函数的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)[重复]