Vim 和 Windows 如何在 Program Files 目录中看到两个具有相同名称的不同文件

Vim 和 Windows 如何在 Program Files 目录中看到两个具有相同名称的不同文件

我发现 vim、Cygwin 工具和 Windows7 之间存在奇怪的交互。我不认为这是一个错误,但同时,我不知道如何解释我所看到的情况。

我安装了 Vim(来自 vim.org,而不是 Cygwin vim):

"C:\Program Files (x86)\Vim".

我进入该目录并使用 vim 本身编辑了我的 _vimrc 文件。

vim _vimrc

我添加了一些设置,写出了文件,然后退出。

然后我将该文件复制到不同的目录来创建我的更改的备份。

copy _vimrc c:\tmp

就在那时,我注意到了这个问题。该文件的副本确实不是包含我的更改。随后进行了大量调查。我将总结调查结果。

在“C:\Program Files (x86)\Vim”中,如果我使用以下任一方法检查文件,我会看到我的更改:

vim, cat, less

(这里,cat 和 less 是 Cygwin 版本。)

但是,如果我使用以下任何一种方法检查文件,我都看不到我的更改:

notepad, type, more

(命令类型和更多是标准 Windows shell 命令。)

给你一个感受:

c:\Program Files (x86)\Vim>ls -l _vimrc
-rwx------+ 1 carlx Domain Users 936 Dec 23 21:15 _vimrc

c:\Program Files (x86)\Vim>dir _vimrc
 Volume in drive C is OSDisk
 Volume Serial Number is 6C86-85EB

 Directory of c:\Program Files (x86)\Vim

06/28/2011  02:09 PM               901 _vimrc
               1 File(s)            901 bytes
               0 Dir(s)  95,964,721,152 bytes free

Cygwin ls 命令显示的文件与 Windows dir 命令不同(日期和大小不同)。

我认为这可能是文件名大小写的问题,但在这些命令中指定 _VIMRC 与 _vimrc 都没有区别。

有人能解释一下我在这里看到的吗?

答案1

正如 Raymond Chen 和 @kreemoweet 上面指出的那样,这是由于文件系统虚拟化。要关闭此功能,您可以使用本地组策略编辑器。在命令提示符中gpedit.msc键入start gpedit.msc并导航到计算机配置 > Windows 设置 > 安全设置 > 本地策略 > 安全选项。滚动到右侧窗口的底部并双击User Account Control: Virtualize file and registry write failures to per-user locations。将设置从启用更改为禁用。

答案2

Windows 通常使用的 NTFS 文件系统确实支持多个同名文件,但文件大小写不同,这是 Windows 努力实现 POSIX 合规性的一部分。有关其他详细信息,请访问http://support.microsoft.com/kb/100625。但是,所有 Windows(以及大概是其大多数 API)和 Windows 提供的应用程序都阻止了这种情况。

因此很可能您确实同时拥有_vimrc_VIMRC- 而标准 API 仅向您显示其中之一(不确定使用什么逻辑来选择哪一个)。我本来想说 vim 必须使用非标准 API 或使用非标准选项调用它才能产生您所观察到的结果,但我似乎无法仅使用 vim 重现这种情况。我认为这是 Cygwin、vim、copy 或任何导致这种情况的程序中的错误 - 这带来了一个很好的观点 - 您实际使用了copy(Cygwin 中不存在)还是cp

另请查看http://www.cygwin.com/cygwin-ug-net/using-specialnames.html#pathnames-casesensitive。这里有一个注册表设置需要您检查,它甚至不仅限于 Cygwin。

答案3

如果你运行 会发生什么C:\Windows\SysWOW64\cmd.exedir我敢打赌你正在被 WOW64 文件重定向。

答案4

正如 Raymond Chen 和 @kreemoweet 在他们的评论中推测的那样,这是一个文件系统虚拟化问题,我在以下位置找到了该文件:

c:\users\<youraccoutname>\appdata\local\virtualstore\program files(86)

这就是答案。谢谢大家。

相关内容