我发现 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.exe
?dir
我敢打赌你正在被 WOW64 文件重定向。
答案4
正如 Raymond Chen 和 @kreemoweet 在他们的评论中推测的那样,这是一个文件系统虚拟化问题,我在以下位置找到了该文件:
c:\users\<youraccoutname>\appdata\local\virtualstore\program files(86)
这就是答案。谢谢大家。