gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:46:04 26 4
gpt4 key购买 nike

我正在使用 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"

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

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

编辑:

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

我的问题是:

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

提前致谢

最佳答案

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

您可能想看看 Environment.GetFolderPath和以下 Environment.SpecialFolder小号:

  • Environment.SpecialFolder.ApplicationData - 应用程序数据的数据文件夹,如果用户配置文件正在漫游,则同步到域 Controller
  • 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 路径,以及要删除的程序数据的实际文件系统路径。不过,我不确定是否有官方方法可以做到这一点......

关于c# - 文件从程序数据重定向到 AppData\Local\VirtualStore\ProgramData,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9996652/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com