文件从程序数据重定向到AppDataLocalVirtualStoreProgramData



我正在使用带有.net 3.5 的C#

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

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

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

运行时:

File.Exists("C:Program DataMyProgramNamefileName.xml")

尽管我确信该文件不存在,但我还是得到了"真的"。

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

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

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

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

编辑:

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

我的问题是:

  1. 为什么会发生这种事
  2. 我该如何防止它发生

提前感谢

您真的必须写入每个系统的程序数据文件夹而不是每个用户的应用程序数据文件夹吗?

您可能需要查看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:ProgramDataMyAppTest.txt。据我所知(管理员模式命令提示符),也没有进行UAC虚拟化。

双击:

我想发生的情况是,在某个时刻,管理员用户将文件写入了ProgramData文件夹,因此,UAC文件系统虚拟化开始生效,并将非管理员写入重定向到VirtualStore

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

我找到了错误的原因。

应用程序试图获得该文件的所有权,然后创建另一个文件。

我去掉了那条线,现在一切都很好。

相关内容

  • 没有找到相关文章

最新更新