2011-11-30 53 views
2

我有一个Ruby应用程序,我正在使用NSIS构建的安装程序在Windows 7上的Program Files下安装(与打包的ruby解释程序一起)。为了调试它,我编辑了一个文件来添加一些调试语句。之后,我卸载了该软件包并运行了新版本的安装程序,其中包含已编辑文件的新副本,而没有调试语句。Program Files下的文件有分裂的个性

现在,我无法获得新的副本加载到红宝石。如果我在cmd.exe中运行type <filename>,或者在Notepad.exe或Firefox中打开该文件,我会看到新版本。如果我运行ruby -e "puts File.read('<filename>')",或者在emacs中打开文件,我会看到旧版本。

如果在Windows资源管理器中,我将该文件复制到一个新文件名,则所有内容都可以在该文件名中看到新内容。如果我删除原始文件并重命名副本以替换原始文件,则分裂的个性将返回。

这种情况在重新启动后仍然存在,所以它不是一个简单的文件被意外打开的问题。

这到底是怎么回事?安装过程中是否有某些方面可能会以我可以恢复的方式检查文件,或者至少在调试安装程序时关闭?

更新

如果我是管理员身份运行控制台运行ruby -e "puts File.read('<filename>')",我看到正确的,新的内容。如何应该我在管理这个文件?

+0

您是否使用完整路径? –

+0

是的,我是。就路径而言,任何情况的唯一区别是用反斜杠和正斜杠代替,但这没有什么区别。 – regularfry

回答

1

一般来说,不要把你打算在Program Files中改变很多的文件。从Vista开始,有一种有趣的方式可以让你“写”到受保护的文件,但它确实存储在你的应用程序数据目录中,而不是在程序文件中。因此,通过Windows API的实用程序会正确找到文件的“新”版本,但更低级别的实用程序(ruby.exe)只能找到现有版本。如果您导航到该文件夹​​,您是否看到内容上方的“兼容性文件”按钮?按此按钮,你会看到你的更新版本。

Scott Hanselman在Vista中引入时写了一个good article about this

当您以管理员身份登录时,只能写入实际文件。

+0

我怀疑ruby.exe打开文件时绕过Windows API。 :) –

+0

是的,我编辑这些文件的唯一原因是因为安装程序无法正常工作 - 我在其他地方弄错了路径,需要注入一些调试输出。通常这些文件不会被编辑。 – regularfry

2

我认为它与UAC文件系统虚拟化有关。检查您的文件是否存在C:\Users\<username>\AppData\Local\VirtualStore。如果有,请将其从VirtualStore中删除。

运行管理员控制台时看到正确文件的事实证明,这是因为虚拟化:对于高级进程,UAC虚拟化处于关闭状态。

相关问题