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

访问区分大小写路径的Windows API(Windows上Ubuntu上的Bash),windows,filesystems,windows-10,Windows,Filesystems,Windows 10,Windows上Ubuntu上的Bash支持区分大小写的文件路径。这意味着我可以创建两个名称大小写不同的文件或目录。不过,我在访问这些文件时遇到了问题 运行 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 m

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

运行

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似乎将目录和文件视为一个整体。因此,双击该目录会出现“目录名无效”错误

使用
cd
也是如此,因为我得到的
目录名无效。
打印出来


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

区分大小写的路径可以在使用NTFS的Windows上使用,但这需要一些额外的工作

首先,必须在系统范围内启用区分大小写功能。通过将
HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\kernel\dword:obcasemensitive
注册表值设置为
0
,然后重新启动系统,可以完成此操作。 我找到了这部分

启用区分大小写后,可以使用
CreateFile
来区分大小写路径。为此,必须将
FILE\u FLAG\u POSIX\u SEMANTICS
作为
dwFlagsAndAttributes
参数的一部分传递。发件人:

访问将根据POSIX规则进行。这包括,对于支持该命名的文件系统,允许多个文件名不同,只是大小写不同

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


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

OpenFileById()应该可以。否则,内核API(用于设备驱动程序)允许您请求区分大小写,但支持必须首先通过注册表设置打开。我猜在Windows组件上安装Ubuntu会开启内核对区分大小写的支持。您最好放弃并通过Ubuntu组件操作这些文件。:-)Windows 10 Creators更新允许您从WSL shell启动Windows应用程序。但是,无法从Windows无法访问的目录启动应用程序。一旦设置了注册表标志,这可能是可能的,但如果没有它(还没有测试)。那么注册表值还没有设置为允许区分大小写?这很有趣;我想知道Windows上的Ubuntu是如何支持它的?我想内核驱动程序可以做的不仅仅是用户模式代码;)当我有时间时,我会研究它。@HarryJohnston“区分大小写由Windows本身处理。如前所述,Windows和NTFS实际上支持区分大小写的操作,因此VolFs只要求对象管理器将路径视为区分大小写,而不管控制此行为的全局注册表项是什么。”所以它没有使用注册表项anyway@LưuVĩnhPhúc,是的,但是如果从用户模式中传递相同的请求,则只有在设置了注册表项时才有效。我的猜测是,该检查只针对用户模式请求,而不是来自内核的请求。或者,可能会对该标志进行不同的处理,因为它来自文件系统驱动程序。不过读起来很有趣。