如何让FindFirstFile对文件进行排序

Rah*_*hul 5 c c++ winapi

我正在使用标准FindFirstFindNext检索目录中的所有文件,但我需要将结果重新排序(按照在资源管理器中单击名称列的顺序相同的顺序排序)我怎样才能实现这一点必须完成通过Win32谢谢

Bri*_*ndy 10

您可以使用索引服务,但我建议您在使用FindFirstFile时自行处理排序.

FindFirstFile Win32 API无法进行排序.有一个稍微高级的FindFirstFileEx,但即使这样也不允许排序.

关于FindFirstFile的限制,有一篇关于The Old New Thing的Raymond Chen 帖子.

你最好的选择可能是将所有结果加载到一个向量中,然后对其进行排序.


RBe*_*eig 6

正如大家所指出的那样,FindFirstFile()不会也不能对它返回的文件进行排序.它以相当低的级别运行,并按照与文件系统目录中目录条目的自然顺序相关的顺序返回文件.

在使用FAT和FAT32格式化的磁盘上,该顺序将与创建文件的顺序密切相关,通过文件删除和可能重新使用现在空的目录条目槽来修改.这是因为FAT目录(就像在许多unix文件系统上一样)只是一个固定大小的目录条目结构的打包数组,以及一个丑陋的黑客,用于将用Unicode编写的长文件名拟合到为ASCII编写的8.3名称设计的目录结构中.与Unix不同,需要Win32 API调用来读取目录条目,但这不会影响条目的读取顺序.

在NTFS上(据我所知),目录在B-Tree的某个变体中表示,因此Win32 API看到的文件的自然顺序与该数据结构的自然索引相关.

您可以DIR在命令提示符下看到与命令的差异.在FAT32卷上,DIR显示文件的顺序与将同一文件夹复制到NTFS卷时的顺序不同.DIR /ON无论使用何种基础文件系统,都应按相同顺序列出文件.

DIR生成的未排序顺序与按名称排序时Windows资源管理器生成的顺序相同.(就此而言,DIR /ON也不一样.)

Windows资源管理器使用与大小写无关的排序,它似乎也忽略了排序中的一些标点符号,并试图使数字变得聪明.特别是,简单地使用qsort()with stricmp()将不会得到与Explorer相同的答案.目前尚不清楚Explorer或DIR使用的实际排序顺序是否记录在任何地方.

例如,以下名称在DIR中排序如下:

C:\temp\test> dir/on/b
aoli.txt
a-one.txt
atwo.txt
b1.txt
b10.txt
b2.txt
b-20.txt
b21.txt
b3.txt
b-4.txt
Run Code Online (Sandbox Code Playgroud)

但是从资源管理器中转录,在"名称"列中排序,它们按以下顺序排列:

aoli.txt
a-one.txt
atwo.txt
b1.txt
b2.txt
b3.txt
b10.txt
b21.txt
b-4.txt
b-20.txt
Run Code Online (Sandbox Code Playgroud)

我无法想象在比较函数中应用简单来获得后者的效果.