FindFirstFileEx 不区分大小写。

3

由于我正在使用一个宏,如果给定的路径与驱动器上的本地路径不相等,则似乎可以工作,因此我首先需要验证路径在大小写方面是否存在。不幸的是(在我的情况下),Directory.Exists() 不区分大小写。

因此,我尝试使用 FindFirstFileEx,并将 dwAdditionalAttributes 设置为 1,这代表 FIND_FIRST_EX_CASE_SENSITIVE。但是似乎对我不起作用。我的本地路径是 C:\Dir1\Dir2\Dir3。我比较的路径是 C:\dir1\Dir2\Dir3。不幸的是,我总是得到 Dir3 作为结果。如果大小写不匹配,我本应该期望得到一个空结果。

我的错误在哪里?

string dir = @"C:\Dir1\Dir2\Dir3" + '\0';
int FIND_FIRST_EX_CASE_SENSITIVE = 1;
WIN32_FIND_DATA fi;

IntPtr h = FindFirstFileEx( dir,
                            FINDEX_INFO_LEVELS.FindExInfoStandard,
                            out fi,
                            FINDEX_SEARCH_OPS.FindExSearchNameMatch,
                            IntPtr.Zero,
                            FIND_FIRST_EX_CASE_SENSITIVE);

3
你实际的路径与你作为参数传递的路径相同。问题中是否有错别字? - ken2k
1
在不区分大小写的环境中,我认为您应该以另一种方式解决原始问题,而不是依赖文件系统对象的大小写。那个宏有什么问题? - Dirk Vollmar
@ken2k 谢谢,是我的错。@0xA3 这个宏会在文件夹浏览对话框中停止展开文件夹,直到遇到不匹配的情况。我无法更改这个宏本身。 - theknut
2个回答

5

这个功能取决于注册表键值 HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\kernel\obcaseinsensitive 的设置为0,而默认值不是0。

换句话说,它取决于底层文件系统的设置,而不是API本身。

更多详细信息请参见: http://www.siao2.com/2010/12/08/10101148.aspx


2
默认情况下,在Windows中进行文件搜索始终不区分大小写,无论是否使用FIND_FIRST_EX_CASE_SENSITIVE。

要更改此设置,您需要更改注册表中的一个值(据我所知)。
请参见此处以获取详细信息:

http://www.nicklowe.org/2012/02/understanding-case-sensitivity-in-windows-obcaseinsensitive-file_case_sensitive_search/

在您的情况下,我期望 HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Kernel, REG DWORD obcaseinsensitive 被设置为 1。

如果我将其设置为0,我需要重新启动吗?因为FindFirstFileEx仍然找到了一些东西... - theknut
天啊...有没有其他方法可以进行区分大小写的验证?我不能重启系统,因为其他人也会使用它。 - theknut
2
不仅是因为其他人可能会使用它 - 它还可能破坏其他东西。以下是我链接的文章中的内容:“这样做的实际效果是更改注册表键,从而“点亮”NT应用程序和驱动程序中潜在的错误,这些错误并未预料到区分大小写的行为。” - Zdeslav Vojkovic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接