【问题标题】:File redirection from Program data to AppData\Local\VirtualStore\ProgramData从程序数据到 AppData\Local\VirtualStore\ProgramData 的文件重定向
【发布时间】:2012-04-17 07:22:13
【问题描述】:

我在 .net 3.5 中使用 C#

我将我的程序数据保存在以下文件中: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. 如何防止这种情况发生

提前致谢

【问题讨论】:

    标签: c# windows filesystems programdata


    【解决方案1】:

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

    您可能想看看Environment.GetFolderPath 和以下Environment.SpecialFolders:

    • 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 路径,以及要删除的程序数据的实际文件系统路径。不过,我不确定是否有官方的方法可以做到这一点......

    【讨论】:

    • 是的。我必须....它应该在所有用户之间共享。我正在使用 Environment.SpecialFolder.ApplicationData 来获取正确的路径
    • @user844541 -- 检查我的编辑。我想知道这是否与此有关。
    • 首先 - 谢谢!事实是我在 program data 下有多个文件,但这是唯一被重定向的文件。关于您的猜测 - 听起来很合理,您指出了发生这种情况的充分理由.. 我会做更多的研究.. 非常感谢/
    【解决方案2】:

    我找到了错误的原因。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-27
      • 2013-04-17
      • 2012-07-05
      • 1970-01-01
      • 2013-08-06
      • 2011-10-14
      相关资源
      最近更新 更多