我在Windows 7上无法编辑此文件:
C:\Program Files (x86)\CMake 2.8.7\share\cmake-2.8\Modules\FindJNI.cmake
如果我在Cygwin(vi)或TextPad中对其进行编辑,则这两个程序会看到更改,因此它将被写入磁盘中的某个位置。但是,如果我在DOS cmd shell中“键入”文件,则看起来该文件根本没有更改。
我注意到的一件事是,在cmd shell中,所有者是Administrators,而在Cygwin的bash shell中,所有者是Dan:
C:\Program Files (x86)\CMake 2.8.7\share\cmake-2.8\Modules>dir /Q FindJ*
Volume in drive C is Windows7_OS
Volume Serial Number is 92CA-8707
Directory of C:\Program Files (x86)\CMake 2.8.7\share\cmake-2.8\Modules
12/30/2011 09:45 AM 1,480 BUILTIN\Administrators FindJasper.cmake
12/30/2011 09:45 AM 7,951 BUILTIN\Administrators FindJava.cmake
12/30/2011 09:45 AM 10,632 BUILTIN\Administrators FindJNI.cmake
12/30/2011 09:45 AM 1,669 BUILTIN\Administrators FindJPEG.cmake
4 File(s) 21,732 bytes
0 Dir(s) 132,524,654,592 bytes free
Dan@home /c/Program Files (x86)/CMake 2.8.7/share/cmake-2.8/Modules
$ ls -al FindJ*
-rwx------+ 1 Dan None 10636 Jan 30 13:57 FindJNI.cmake
-rwx------+ 1 Administrators None 1669 Dec 30 09:45 FindJPEG.cmake
-rwx------+ 1 Administrators None 1480 Dec 30 09:45 FindJasper.cmake
-rwx------+ 1 Administrators None 7951 Dec 30 09:45 FindJava.cmake
怎么会这样?就像在同一目录中有两个不同的文件,它们具有相同的名称。
由于Windows Vista(UAC)引入了安全功能,任何试图写入受保护位置(例如“程序文件”)的非管理员程序都将捕获其写操作,并将其重定向到其他“用户友好”位置。
创建该文件的程序将能够看到该文件,但是大多数其他程序将看不到该文件。
Wikipedia指出(并且我已突出显示相关部分):
假设用户将以管理员权限运行的应用程序在使用受限用户帐户运行时会在Windows的早期版本中遇到问题,这通常是因为它们试图写入计算机范围或系统目录(例如Program Files)或注册表项(特别是HKLM)。UAC尝试使用文件和注册表虚拟化来缓解这种情况,该技术将写入(和后续读取)重定向到用户配置文件中每个用户的位置。例如,如果应用程序尝试写入“ C:\ program files \ appname \ settings.ini”,而用户无权写入该目录,则写入将重定向到“ C:\ Users \ username” \ AppData \ Local \ VirtualStore \ Program Files \ appname \ settings.ini”。
因此,从理论上讲,您更改后的文件实际上已被写入C:\Users\YourUserName\AppData\Local\VirtualStore\Program Files (x86)\CMake 2.8.7\share\cmake-2.8\Modules
解决此限制的唯一方法是完全禁用UAC,出于安全考虑,不建议这样做。
最好的解决方案是您的路径中实际上应该有cmake,并且使用的是不受保护的位置,例如用户配置文件中的某个位置。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句