4

我将 C# 与 .net 3.5 一起使用

我将程序数据保存在以下文件中:C:\Program Data\MyProgramName\fileName.xml

安装并运行我的应用程序一次后,我将其卸载(在卸载过程中,我从“程序数据”中删除所有文件),然后重新安装应用程序并运行它。

奇怪的是,我的应用程序启动时就好像程序数据中的文件存在一样 - 这意味着,即使数据文件被删除,我的应用程序中也有旧数据。

运行时:

File.Exists("C:\Program Data\MyProgramName\fileName.xml")

即使我确定该文件不存在,我也得到了“真实”。

当我以管理员身份运行应用程序然后文件不存在时,事情变得奇怪了。

经过研究,我发现在没有管理员权限的情况下运行我的应用程序而不是获取:“C:\Program Data\MyProgramName\fileName.xml”我得到“C:\Users\userName\AppData\Local\VirtualStore\ProgramData \MyProgramName\fileName.xml"

确实有一个文件存在于以前的安装中(我显然没有删除它,因为我不知道它存在)。

所以显然在程序数据下有一些文件的虚拟路径。

编辑 :

我发现删除虚拟商店中的旧文件后,我的应用程序突然能够找到正确的文件。(我没有对 Program Data 下的文件进行任何更改。

我的问题是:

  1. 为什么会这样。
  2. 我怎样才能防止它发生

提前致谢

4

2 回答 2

5

实际上是否必须写入每个系统的 Program Data 文件夹而不是每个用户的 Application Data 文件夹?

您可能想查看Environment.GetFolderPath以下内容Environment.SpecialFolder

  • Environment.SpecialFolder.ApplicationData- 应用程序数据的数据文件夹,如果用户配置文件正在漫游,则同步到域控制器
  • Environment.SpecialFolder.LocalApplicationData- 应用程序数据的数据文件夹,本地和不同步的(例如,缓存有用)

编辑:

在 Windows 7 x64 上测试,非管理员用户。

var appData = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData);
var myFolder = Path.Combine(appData, "MyApp");
if(!Directory.Exists(myFolder)) Directory.CreateDirectory(myFolder);
File.WriteAllText(Path.Combine(myFolder, "Test.txt"), "Test.");

这符合预期,即。写入C:\ProgramData\MyApp\Test.txt. 据我所知(管理员模式命令提示符),也没有进行 UAC 虚拟化。

双重编辑:

我猜发生的事情是在某个时候管理员用户已将文件写入您的 ProgramData 文件夹,因此,UAC 文件系统虚拟化启动并将非管理员写入重定向到VirtualStore.

您的卸载程序是否以管理员身份运行?如果是这样,您可能必须检查VirtualStore启动卸载的用户的路径以及要删除的程序数据的实际文件系统路径。我不确定是否有官方的方法可以做到这一点,虽然......

于 2012-04-03T15:42:39.140 回答
3

我找到了错误的原因。

应用程序正在尝试获取该文件的所有权,然后创建另一个文件。

我删除了那条线,现在一切正常。

于 2012-04-15T10:52:47.367 回答