我有一些代码正在读取配置文件,但是当我在 TextPad 中打开该文件时,我看到的值与我的应用程序不同。我用记事本检查了它。记事本同意我的应用程序,但 TextPad 显示的是其他内容。
这是 Vista x64 Business。
知道是什么原因造成的吗?我查看了Context Menu->Properties->Previous Versions
详细信息,但它显示“没有可用的先前版本”。
有人要求我举一个例子,下面是复制的步骤(我无法可靠地实现它):
- 在程序文件中安装了.NET应用程序。
- 该应用程序读取了配置文件,但是失败了。
- 我在 Textpad 中手动编辑该配置文件。
- 更改未生效。
- 我在记事本中打开配置文件,看到了一些不同的东西。
- 尝试在记事本中进行更改并保存,并收到此错误消息:
记事本
无法为 FogBugz\FogBugz > WorkingOn.exe.config 创建 C:\Program Files (x86)\Daniel Schaffer\WorkingOn 文件。
确保路径和文件名正确。
我无法将内容放在这里,因为它是 XML 并且正在由 Superuser.com 编码,但这里有一个截屏视频的链接: http://screencast.com/t/zhERl7mocp4。
答案1
你可能遇到了 Vista 的 UAC 功能的一部分,称为虚拟商店。以下是文章的片段:
当应用程序写入只有管理员可写入的系统位置时,Windows 会将所有后续文件操作写入虚拟存储目录下的用户特定路径,该路径位于 %LOCALAPPDATA%\VirtualStore。稍后,当应用程序读回此文件时,计算机将提供虚拟存储中的文件。由于 Windows 安全基础结构无需应用程序的协助即可处理虚拟化,因此应用程序认为它能够成功直接读取和写入 Program Files。文件虚拟化的透明性使应用程序能够感知到它们正在从受保护的资源写入和读取,而实际上它们正在访问虚拟化版本。
您的应用程序在非提升(非管理员)上下文中运行。因此,当它尝试打开 Program Files 文件夹中的文件时,该请求将透明地重定向到您的用户帐户虚拟存储位置。您的 TextPad 副本是可能在提升的上下文中运行,因此它看到的文件位于真实的程序文件文件夹。
如果这是您可以更改其功能的代码,并且您希望用户能够在不以管理员身份运行的情况下使用它,则应将存储配置文件的位置更改为其所属的用户 ApplicationData 文件夹中的某个位置。如今,强烈不鼓励将设置写入存储在应用程序安装文件夹中的配置文件。如果您确实有应该应用于计算机上所有用户的设置,则应将它们写入所有用户应用程序数据文件夹。即使这样,您仍然必须默认在提升上下文中运行应用程序,除非您明确授予用户组对您的文件夹的写访问权限。
在为 Vista 及更高版本编写软件时,请牢记这句口头禅。“用户只能写入自己的个人资料...用户只能写入自己的个人资料”
答案2
记事本无法创建该文件的原因是另一个进程正在锁定它。由于文件的内容发生了变化,我猜想应用程序在您查看文件时正在写入文件。