我有一个奇怪的错误,我的代码返回一个文件未找到异常,但文件似乎正好在它应该的位置。我的项目有一些代码来运行系统cmdlet并在XML输出文件中查找cmdlet的结果。我们告诉cmdlet将此输出XML放在系统TEMP目录的自定义子目录中,例如C:\ WINDOWS \ TEMP \ SomeFolder \ output.xml。然后,我们使用.NET XmlDocument类打开并解析XML文件。
在WinXP上,这有效。在我的开发盒上,这是有效的。在干净的Win7测试机器上,它没有。
我的第一个想法是我遇到了Vista / Win7文件虚拟化,但是我们的应用程序清单指定我们的应用程序以管理员身份运行 - 从我读过的内容中,它应该绕过文件虚拟化。
另一个问题是我们的代码喜欢使用UNC文件路径,即使该文件是本机的本地文件。 (我们要求有问题的代码可能需要在远程计算机上运行cmdlet,因此输出XML也可以在远程计算机上。)因此我们尝试通过\ MATT-WIN7 \ C打开XML文件$ \ WINDOWS \ TEMP \ SomeFolder.xml而不是C:\ WINDOWS \ TEMP \ SomeFolder \ output.xml。
但我暂时删除了UNC路径代码,当Windows资源管理器显示文件正好位于我认为的位置时,对File.Exists()的简单调用仍然表示XML文件不存在。
我还没有读过关于文件虚拟化的细微差别吗?
我的解决方法是将输出xml文件移动到其他位置,但是当它需要在远程计算机上运行时,这可能会破坏我们代码的“可移植性”,因为使用%TEMP%位置是一个可以的位置很容易解决远程计算机(通过远程注册表调用来查找系统环境变量)。
我更希望将文件保留在原来的位置,并修复我们的代码,以便它实际找到该文件!
答案 0 :(得分:6)
%TEMP%环境变量有一个特定于用户的覆盖,指向%USERPROFILE%\AppData\Local\Temp
,而不是%SYSTEMROOT%\Temp
。确保您的代码正在查看您希望它查看的临时文件夹。
更新:根据您的评论,问题似乎是您的应用实际上并未在测试计算机上升级,而是在您的开发计算机上提升。我怀疑以下内容:
您可以创建自签名证书以对二进制文件进行代码签名,并将该证书添加到测试计算机,以获取UAC提示。确认应用程序正确升级后,访问系统%TEMP%文件夹的代码应该可以正常工作。