从程序数据到 AppData\Local\VirtualStore\ProgramData 的文件重定向

use*_*541 3 c# windows filesystems programdata

我在 .net 3.5 中使用 C#

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

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

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

运行时:

File.Exists("C:\Program Data\MyProgramName\fileName.xml")
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

所以很明显,程序数据下的文件有一些虚拟路径。

编辑 :

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

我的问题是:

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

提前致谢

AKX*_*AKX 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.");
Run Code Online (Sandbox Code Playgroud)

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

双重编辑:

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

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