Windows API 访问区分大小写的路径 (Bash-on-Ubuntu-on-Windows)

Windows API to access case-sensitive paths (Bash-on-Ubuntu-on-Windows)

Bash-on-Ubuntu-on-Windows 支持区分大小写的文件路径。这意味着我可以创建两个名称仅大小写不同的文件或目录。不过,我在访问这些文件时遇到问题。

运行

bash -c "touch Magic ; mkdir magic ; echo Secret! > magic/secret"

创建一个名为 Magic 的文件、一个名为 magic 的目录和一个名为 secret 的目录。

bash -c "ls -lR" 产量

.:
total 0
drwxrwxrwx 2 root root 0 Aug 23 10:37 magic
-rwxrwxrwx 1 root root 0 Aug 23 10:37 Magic

./magic:
total 0
-rwxrwxrwx 1 root root 8 Aug 23 10:37 secret

(我不确定为什么会得到 root,因为它不是默认用户,但这似乎与我的问题无关。)

Windows 资源管理器显示:

现在,虽然 bash 可以轻松访问目录中的 magic/secret 文件,但 Windows 似乎将目录和文件视为一个文件。所以双击目录我得到一个 "directory name invalid" 错误

同样适用于使用 cd,因为我打印出 The directory name is invalid.

是否有任何 API 允许我访问或创建这些区分大小写的路径?似乎常规 Windows API 在访问现有文件时完全忽略字符大小写。

区分大小写的路径可用于 Windows NTFS,但需要一些额外的工作。

首先,必须在系统范围内启用区分大小写。这是通过将 HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\kernel\ dword:ObCaseInsensitive 注册表值设置为 0,然后重新启动系统来完成的。 我找到这部分 here.

启用区分大小写后,就可以使用 CreateFile 来处理区分大小写的路径。为此,您必须将 FILE_FLAG_POSIX_SEMANTICS 作为 dwFlagsAndAttributes 参数的一部分传递。来自 msdn:

Access will occur according to POSIX rules. This includes allowing multiple files with names, differing only in case, for file systems that support that naming.

我在 答案中找到了这一部分。

通过设置注册表设置和 CreateFile 标志,我能够访问区分大小写的路径。