奇怪的,可能的“影子副本”问题,两个编辑器显示不同的内容

Nei*_*ell 2 windows-vista filesystems shadow-copy

我有一些代码正在读取配置文件,但是当我在 TextPad 中打开文件时,我看到的值与我的应用程序不同。我用记事本检查过。记事本同意我的申请,TextPad 显示其他内容。

这是在 Vista x64 商业版上。

知道是什么原因造成的吗?我查看了Context Menu->Properties->Previous Versions详细信息,但它说“没有可用的先前版本”。

我被要求举个例子,这是复制的步骤(我不能让它可靠地发生):

  1. 在程序文件中安装了 .NET 应用程序。
  2. 该应用程序读取配置文件,但失败了。
  3. 我在 Textpad 中手动编辑该配置文件。
  4. 更改不会生效。
  5. 我在记事本中打开配置文件,看到了不同的东西。
  6. 尝试在记事本中进行更改并保存,并收到此错误消息:

记事本

无法为 FogBugz\FogBugz > WorkingOn.exe.config 文件创建 C:\Program Files (x86)\Daniel Schaffer\WorkingOn。

确保路径和文件名正确。

我不能把内容放在这里,因为它是 XML 并且由 Superuser.com 编码,但这里有一个截屏链接:http : //screencast.com/t/zhERl7mocp4

Rya*_*ger 6

您可能会遇到称为Virtual Store的 Vista UAC 功能的一部分。这是文章的一个片段:

当应用程序写入只能由管理员写入的系统位置时,Windows 会将所有后续文件操作写入 Virtual Store 目录下的用户特定路径,该目录位于 %LOCALAPPDATA%\VirtualStore。稍后,当应用程序读回此文件时,计算机将在 Virtual Store 中提供该文件。由于 Windows 安全基础结构在没有应用程序帮助的情况下处理虚拟化,应用程序认为它能够成功地直接读取和写入程序文件。文件虚拟化的透明性使应用程序能够感知到它们正在从受保护资源写入和读取,而实际上它们正在访问虚拟化版本。

您的应用程序在非高级(非管理员)上下文中运行。因此,当它尝试打开 Program Files 文件夹中的文件时,该请求会透明地重定向到您的用户帐户 Virtual Store 位置。你TextPad的副本可能在提升的上下文中运行,所以它是看到了文件生命中真正的Program Files文件夹。

如果这是您可以更改其功能的代码,并且您希望用户无需以管理员身份运行即可使用它,则您应该将存储配置文件的位置更改为它所属的用户 ApplicationData 文件夹中的某个位置。如今,强烈建议不要将设置写入存储在应用程序安装文件夹中的配置文件。如果您确实有应应用于计算机上所有用户的设置,则应将它们写入“所有用户应用程序数据”文件夹。即便如此,除非您明确授予用户组对您的文件夹的写入权限,否则默认情况下您仍然必须在 Elevated 上下文中运行应用程序。

当您为 Vista 及更高版本编写软件时,只需将这句口头禅牢记在心即可。“用户只能写入他们的个人资料...用户只能写入他们的个人资料”