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
,因为它不是默认用户,但这似乎与我的问题无关。)
现在,虽然bash
可以轻松访问目录中的magic/secret
文件,但Windows似乎将目录和文件视为同一个文件。所以双击目录我得到一个"目录名无效"错误
使用cd
同样如此,因为我打印出The directory name is invalid.
。
是否有任何API允许我访问这些区分大小写的路径或创建它们?在访问现有文件时,似乎常规Windows API完全忽略了字符大小写。
答案 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
标志,我能够访问区分大小写的路径。