Windows环境中的文件路径不区分大小写吗?

57

可以假设Windows本地和网络文件路径不区分大小写吗?


2
定义“安全”。NTFS可以配置为区分大小写的文件名,但几乎没有人这样做(而那些这样做的人通常准备好承担破坏程序的责任)。但是你为什么需要知道这个? - hmakholm left over Monica
1
@Ken,51%并不代表有什么问题。很多问题——通常是最有趣的问题——只是没有合理的答案。51%表明这不是一个不知道勾选框用途的用户;无论他有什么其他缺点,他显然会对接受什么做出一些理性决策。 - hmakholm left over Monica
2
@Henning,我不同意。如果你问了100个问题,其中有50个没有人能回答,那么要么你问了很多无用的问题,要么你问的问题与主题无关,或者你在解决问题后没有跟进并回答自己的问题以使他人受益。但是当然你有自己的观点。 :) - Ken White
我看到Windows现在有一种笨拙的解决方法。你可以为一个目录或每个目录分配大小写敏感属性。也就是说,fsutil.exe文件setCaseSensitiveInfo <path> enable|disable。不递归。 - Gary Walker
3个回答

50

是的。Windows(本地)文件系统,包括NTFS、FAT和变体,在正常情况下都是不区分大小写的。然而,网络文件系统的底层实现可能是区分大小写的,不过大多数允许Windows访问它的软件(例如SMB)都会自动将区分大小写的文件系统呈现为对Windows不区分大小写。

有关详细信息,请阅读Wikipedia文件名文章中的章节。


5
我可以翻译这篇文章。以下是翻译的结果:在最新版本的 Windows Subsystem for Linux (WSL) 2 中,用户可以为每个目录设置大小写敏感(或不敏感)。这一变化是基于许多用户想要在 WSL 中体验类 Unix 文件系统的真实行为的反馈。在过去,WSL 一直采用大小写不敏感的文件系统,这与 Windows 操作系统默认值相同。但对于某些用户来说,这可能导致问题,例如当使用 Git 等工具时,文件名大小写不敏感可能会导致冲突。现在,用户可以通过在 WSL 中运行命令来更改每个目录的大小写敏感性:fsutil.exe file SetCaseSensitiveInfo <目录路径> enable|disable。需要注意的是,此选项只适用于格式为 ext4 的 Linux 文件系统。总体而言,这一变化使得 WSL 更加逼真,并且允许用户更好地模拟在真正的 Unix 环境中的工作方式。 - Bernhard

36

在Windows上,大小写敏感性实际上是由应用程序打开文件的方式实现的。NTFS可以是大小写敏感的文件系统,并且可以快乐地存储具有相同名称但仅以大小写区分的文件。

在Windows上,所有文件最终都是通过CreateFile API打开的 - 如果传递了FILE_FLAG_POSIX_SEMANTICS标志(并且正在访问的文件系统是本地大小写敏感的),则将基于精确名称匹配打开该文件。如果未传递FILE_FLAG_POSIX_SEMANTICS,则文件系统会执行不区分大小写的文件打开操作,并将打开具有匹配名称的其中一个文件。如果有多个,则无法确定实际上要打开哪个。

在Windows上,大多数C和C++运行时实现都不提供对此机制的任何访问,并且从不使用此标志,因此要想获得访问大小写敏感行为的唯一方法是直接使用Windows API。

tl;dr-您的语言运行时可能将文件系统公开为不区分大小写或保留大小写。如果直接使用Windows API,则可以访问完全支持大小写敏感的文件系统。


“并且正在访问的文件系统本身是区分大小写的” - 我们能确定NTFS总是满足这一点吗?是否有任何选项可以使某些NTFS不区分大小写? - jw_

3
不,这不是一个安全的假设。 其他答案很有启发性,但无论它们说什么,这都不是一个安全的假设,并且随着时间的推移它变得越来越不安全。 enter image description here enter image description here

NFST - 可以区分大小写。 我在每个目录上使用它,但你也可以用整个NTFS驱动器。 https://devblogs.microsoft.com/commandline/per-directory-case-sensitivity-and-wsl/

WSL - 区分大小写。 Linux GUI应用程序和Android应用程序即将进入Windows。默认情况下,它们都在本地运行于一个区分大小写的文件系统上。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接