Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从程序数据到AppData\Local\VirtualStore\ProgramData的文件重定向_C#_Windows_Filesystems_Programdata - Fatal编程技术网

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

C# 从程序数据到AppData\Local\VirtualStore\ProgramData的文件重定向,c#,windows,filesystems,programdata,C#,Windows,Filesystems,Programdata,我正在将C#与.NET3.5一起使用 我正在将程序数据保存在以下文件中:C:\program data\MyProgramName\fileName.xml 在安装并运行我的应用程序一次后,我卸载了它(在卸载过程中,我将从“程序数据”中删除所有文件) 然后我重新安装应用程序,并运行它 奇怪的是,我的应用程序启动时就好像程序数据中的文件存在一样——这意味着,即使数据文件被删除,我的应用程序中也有旧数据 运行时: File.Exists("C:\Program Data\MyProgramName\

我正在将C#与.NET3.5一起使用

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

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

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

运行时:

File.Exists("C:\Program Data\MyProgramName\fileName.xml")
即使我确信该文件不存在,我还是得到了“true”

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

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

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

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

编辑:

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

我的问题是:

  • 为什么会这样
  • 我怎样才能防止它发生
  • 提前感谢

    您是否确实需要写入每个系统程序数据文件夹而不是每个用户应用程序数据文件夹

    您可能需要查看以下内容:

    • 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获取正确的path@user844541--检查我的编辑。我想知道这是否与此有关。首先-谢谢!事实上,我有不止一个文件程序数据,但这是唯一被重定向的文件。关于你的猜测-听起来很合理,你指出了发生这种情况的一个很好的原因..我会做更多的研究..非常感谢/