程序文件下的文件具有分裂的个性

时间:2011-11-30 17:49:06

标签: ruby windows installer nsis

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

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

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

这种情况在重新启动后仍然存在,因此文件被意外打开并不是一件简单的事情。

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

更新

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

2 个答案:

答案 0 :(得分:2)

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

运行管理员控制台时看到正确文件的事实证明这是因为虚拟化:UAC虚拟化已被关闭以用于升级流程。

答案 1 :(得分:1)

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

Scott Hanselman在Vista中引入时good article about this写了一篇文章。

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