FindNextFile WinApi函数用于列出目录内容。微软在文档中说明,该顺序依赖于文件系统。但是NTFS在大多数情况下应该按字母顺序排列。
此函数返回文件名的顺序取决于文件系统类型。 对于NTFS文件系统和CDFS文件系统,名称通常按字母顺序返回。对于FAT文件系统,名称通常按文件写入磁盘的顺序返回,可能是可能不是按字母顺序排列。但是,如前所述,这些行为无法保证。
我的应用程序需要在目录中对对象进行一些排序。由于大多数Windows用户使用NTFS,我想优化我的应用程序。因此我使用函数_wcsicmp进行名称比较。大多数情况下它是正确的,FindNextFile的结果根据 _wcsicmp 进行排序。但有时候结果没有排序。我想,这很自然,因为FindFirstFile不保证顺序,我必须对它进行排序(如果是另一个文件系统)。然后我注意到奇怪的模式。看起来字母'_'在字母后返回。包含内容(a.txt,b.txt,_. txt)的文件夹按顺序a,b,_返回。函数_wcsicmp将其排序为_,a,b。在Windows 8.1上测试过。我运行了一些测试,这种行为是一致的。
有人可以解释一下NTFS使用的比较标准是什么?或者为什么FindNextFile会按字母顺序返回名称?
答案 0 :(得分:6)
因为NTFS排序规则不是那么简单,只是按字母顺序排序。这是一篇msdn博客文章,阐述了这个问题:
Why do NTFS and Explorer disagree on filename sorting?
这可能是NTFS captures the case mapping table at the time the drive is formatted and continues to use that table的一个原因,即使操作系统的案例映射表随后发生变化。
答案 1 :(得分:1)
您可以使用CompareStringEx
并设置标记SORT_DIGITSASNUMBERS
此功能的最低系统要求是Windows Vista
LINK
int CompareStringEx(0,0x00000008/*SORT_DIGITSASNUMBERS*/,
lpString1, cchCount1, lpString2, cchCount2, NULL, NULL, 0);
此函数的比较结果很奇怪,它返回1,2或3:
#define CSTR_LESS_THAN 1 // string 1 less than string 2
#define CSTR_EQUAL 2 // string 1 equal to string 2
#define CSTR_GREATER_THAN 3 // string 1 greater than string 2
您还可以尝试_wcsicoll
旧系统。如果我没记错的话,_wcsicoll
效果会更好,但与Windows的排序方式不同。