[英]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
,因为它不是默认用户,但这似乎与我的问题无关。)
现在,虽然bash
可以轻松访问目录中的magic/secret
文件,但Windows似乎将目录和文件视为同一个文件。 所以双击目录我得到“目录名无效”错误
使用cd
,因为我得到了The directory name is invalid.
打印出来。
是否有任何API允许我访问这些区分大小写的路径或创建它们? 在访问现有文件时,常规Windows API似乎完全忽略了字符大小写。
区分大小写的路径可以在Windows上使用NTFS,但它需要一些额外的工作。
首先,必须在系统范围内启用区分大小写。 这是通过将HKLM\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\\kernel\\ dword:ObCaseInsensitive
注册表值设置为0
,然后重新启动系统来完成的。 我在这里找到了这个部分。
启用区分大小写后,可以将CreateFile
用于区分大小写的路径。 为此,您必须将FILE_FLAG_POSIX_SEMANTICS
作为dwFlagsAndAttributes
参数的一部分传递。 来自msdn :
根据POSIX规则进行访问。 这包括允许具有名称的多个文件(仅在大小写上有所不同)用于支持该命名的文件系统。
我在这个答案中找到了这一部分。
通过设置注册表设置和CreateFile
标志,我能够访问区分大小写的路径。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.