在Win7上的%TEMP%中找不到文件

时间:2010-06-29 15:34:32

标签: c# windows-7 file-io

我有一个奇怪的错误,我的代码返回一个文件未找到异常,但文件似乎正好在它应该的位置。我的项目有一些代码来运行系统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%位置是一个可以的位置很容易解决远程计算机(通过远程注册表调用来查找系统环境变量)。

我更希望将文件保留在原来的位置,并修复我们的代码,以便它实际找到该文件!

1 个答案:

答案 0 :(得分:6)

%TEMP%环境变量有一个特定于用户的覆盖,指向%USERPROFILE%\AppData\Local\Temp,而不是%SYSTEMROOT%\Temp。确保您的代码正在查看您希望它查看的临时文件夹。

更新:根据您的评论,问题似乎是您的应用实际上并未在测试计算机上升级,而是在您的开发计算机上提升。我怀疑以下内容:

  • 您要么在开发计算机上禁用了UAC,要么以管理员身份运行VS.两者都很大禁忌。 :-)
  • 您的二进制文件未经过代码签名,并且不在两个受信任位置之一 - %SystemRoot%\ system32或%ProgramFiles%。出于安全原因,UAC甚至不会提示用户提升具有提升清单但未进行代码签名或位于受信任位置的应用程序。

您可以创建自签名证书以对二进制文件进行代码签名,并将该证书添加到测试计算机,以获取UAC提示。确认应用程序正确升级后,访问系统%TEMP%文件夹的代码应该可以正常工作。