我正在使用.NET 3.5的C#
我将程序数据保存在C:\ Program Data \ MyProgramName \ fileName.xml文件中
安装并运行我的应用程序一次,我卸载它(在卸载过程中,我从“程序数据”中删除所有文件),然后重新安装应用程序,并运行它。
奇怪的是,我的应用程序开始,就像程序数据中的文件存在 – 意味着,即使数据文件被删除,我的应用程序中有旧数据。
运行时:
File.Exists("C:\Program Data\MyProgramName\fileName.xml")
即使我确定文件不存在,我也是“真的”。
当我以pipe理员身份运行应用程序,然后文件不存在时,事情变得陌生。
经过研究,我发现当运行我的应用程序没有pipe理员权限而不是得到:“C:\ Program Data \ MyProgramName \ fileName.xml”我得到“C:\用户\用户名\ AppData \本地\ VirtualStore \ ProgramData \ MyProgramName \ filename.xml中”
确实有一个从以前的安装存在的文件(我显然没有删除,因为我不知道它存在)。
所以显然在程序数据下有一些到文件的虚拟path。
编辑:
我发现删除虚拟商店中的旧文件后,我的应用程序突然发现了正确的文件。 (我没有在程序数据下对文件进行任何更改。
我的问题是:
提前致谢
您是否真的必须写入每个系统的程序数据文件夹而不是每个用户的应用程序数据文件夹?
你可能想看看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 。
您的卸载程序是否以管理员身份运行? 如果存在,则可能需要检查启动卸载的用户的VirtualStore路径以及要删除的程序数据的实际文件系统路径。 我不确定是否有官方的方式来做到这一点,虽然…
我找到了错误的原因。
应用程序试图获取文件的所有权,然后创建另一个文件。
我删除了这一行,现在一切正常。