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


6

我看到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

(在此,Cygwin版本为cat,而更少。)

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

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都没有区别。

谁能解释我在这里看到的内容?


7
这可能是文件系统虚拟化。

7
如果这是虚拟化问题,则可以在c:\ users \ <您的帐户名称> \ appdata \ local \ virtualstore \ program files(86)中找到已编辑的文件
kreemoweet 2011年

哇。你是对的,kreemoweet。我查看了您指定的目录,并且已编辑的文件在那里。这对我来说真的很奇怪。您知道我在哪里阅读有关Windows文件系统虚拟化的更多信息吗?谢谢!
卡尔·帕克

3
@kreemoweet-您应该发表评论作为答案。
Nifle

Answers:


3

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


2
请注意,由于文件系统虚拟化是一项兼容性措施,因此将其关闭可能会破坏某些旧版应用程序。
哈里·约翰斯顿

0

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。


Windows复制命令是我最初用来复制文件的命令,它导致“复制”没有我的更改。如果使用cp命令(来自Cygwin),则可以将文件(带有更改)复制到其他目录。

@CarlParker-请同时检查指向我刚刚添加到答案中的Cygwin文档的链接。
ziesemer

这里所有的否决票是什么-两个答案都对吗?
ziesemer

我不知道那是什么反对票。尽管您的回答并不是答案的谜,但它仍然很有帮助,我感谢您的回答。(与上面的@Paul Betts类似。)
卡尔·帕克

0

如果您跑步C:\Windows\SysWOW64\cmd.exedir怎样?我敢打赌,您正在重定向WOW64文件。


谢谢。在c:\ windows \ SysWow64 \ cmd.exe下,dir和ls仍报告文件的不同日期和大小。
卡尔·帕克

程序文件文件夹不受WOW64重定向的约束。
哈里·约翰斯顿

@PaulBetts:请参考。MSDN上有关文件重定向的文章仅提到system32文件夹:msdn.microsoft.com/en-us/library/aa384187%28v=vs.85%29
哈里·约翰斯顿

此外,我刚刚尝试过。使用32位cmd.exe,我查看了c:\ windows \ system32,并按预期看到了c:\ windows \ syswow64的内容。但是,在c:\ Program Files中查看并不会显示c:\ Program Files(x86)的内容。
哈里·约翰斯顿

@HarryJohnston确实,msdn.microsoft.com / zh-cn / library / bb756960.aspx上的MSDN Library页面似乎暗示着对任何文件夹的任何写入都可以通过文件系统虚拟化来重定向。
弗兰

0

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

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

这就是答案。多谢你们。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.