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

时间:2016-08-23 08:03:59

标签: windows filesystems windows-10

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资源管理器显示: Windows Explorer shows file and directory

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

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

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

1 个答案:

答案 0 :(得分:4)

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

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

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

  

根据POSIX规则进行访问。这包括允许具有名称的多个文件(仅在大小写上有所不同)用于支持该命名的文件系统。

我在this回答中找到了这个部分。

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