FindNextFile命令NTFS

问题描述 投票:1回答:2

FindNextFile WinApi函数用于列出目录的内容。 Microsoft在文档中指出,该顺序取决于文件系统。但是,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返回的名称不按字母顺序排列?

winapi ntfs
2个回答
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,即使OS的大小写映射表随后发生了变化。


1
投票

您可以使用CompareStringEx并设置标志SORT_DIGITSASNUMBERS此功能的最低系统要求是Windows VistaLINK

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的排序不同。

© www.soinside.com 2019 - 2024. All rights reserved.