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
标志,我能够访问区分大小写的路径。
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
标志,我能够访问区分大小写的路径。