【问题标题】:Files under Program Files have a split personalityProgram Files 下的文件具有分裂的个性
【发布时间】:2011-11-30 17:49:06
【问题描述】:

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

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

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

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

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

更新

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

【问题讨论】:

  • 你使用的是完整路径吗?
  • 是的,我是。就路径而言,任何情况下的唯一区别是替换反斜杠和正斜杠,但这没有区别。

标签: ruby windows installation nsis


【解决方案1】:

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

您在运行管理员控制台时看到正确文件的事实证明这是因为虚拟化:UAC 虚拟化已针对提升的进程关闭。

【讨论】:

    【解决方案2】:

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

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

    只有以管理员身份登录后才能写入真实文件。

    【讨论】:

    • 我怀疑 ruby​​.exe 在打开文件时会绕过 Windows API。 :)
    • 是的,我编辑这些文件的唯一原因是安装程序无法正常工作——我在其他地方的路径错误,需要注入一些调试输出。通常这些文件不会被编辑。
    猜你喜欢
    • 2011-06-19
    • 1970-01-01
    • 2010-11-14
    • 2012-04-21
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多