我正在使用标准FindFirst
并FindNext
检索目录中的所有文件,但我需要将结果重新排序(按照在资源管理器中单击名称列的顺序相同的顺序排序)我怎样才能实现这一点必须完成通过Win32谢谢
您可以使用索引服务,但我建议您在使用FindFirstFile时自行处理排序.
FindFirstFile Win32 API无法进行排序.有一个稍微高级的FindFirstFileEx,但即使这样也不允许排序.
关于FindFirstFile的限制,有一篇关于The Old New Thing的Raymond Chen 帖子.
你最好的选择可能是将所有结果加载到一个向量中,然后对其进行排序.
正如大家所指出的那样,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
但是从资源管理器中转录,在"名称"列中排序,它们按以下顺序排列:
aoli.txt a-one.txt atwo.txt b1.txt b2.txt b3.txt b10.txt b21.txt b-4.txt b-20.txt
我无法想象在比较函数中应用简单来获得后者的效果.