我正在使用带有.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中“
确实有一个文件存在于以前的安装中(我显然没有删除,因为我不知道它存在)。
很明显,在程序数据下有一些文件的虚拟路径。
编辑:
我发现在删除虚拟商店中的旧文件后,我的应用程序突然能够找到正确的文件。 (我没有对程序数据下的文件进行任何更改。
我的问题是:
提前致谢
答案 0 :(得分:4)
您实际是否必须写入每系统程序数据文件夹而不是每用户应用程序数据文件夹?
您可能需要查看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:\ProgramData\MyApp\Test.txt
。据我所知(管理员模式命令提示符),也没有UAC虚拟化。
重复编辑:
我想发生的事情是,在某些时候,管理员用户已将文件写入您的ProgramData文件夹,因此,UAC文件系统虚拟化启动并将非管理员写入重定向到VirtualStore
。< / p>
您的卸载程序是否以管理员身份运行?如果是,则可能必须同时检查启动卸载的用户的VirtualStore
路径以及要删除的程序数据的实际文件系统路径。我不确定是否有正式的方法来做到这一点,但是......
答案 1 :(得分:3)
我找到了这个错误的原因。
应用程序试图获取文件的所有权,然后创建另一个文件。
我删除了该行,现在一切正常。