我正在使用C#和.net 2.0
我将程序数据保存在C:\Program Data\MyProgramName\fileName.xml
安装并运行我的应用程序一次后我卸载它(在卸载期间我从“程序数据”中删除所有文件)然后重新安装应用程序,然后运行它。
奇怪的是,我的应用程序就像程序数据中存在的文件一样启动 - 意思是,即使数据文件被删除,我的应用程序中也有旧数据。
运行时:
File.Exists(“C:\ Program Data \ MyProgramName \ fileName.xml”)
即使我确定该文件不存在,我仍然“真实”。
当我以管理员身份运行应用程序然后文件不存在时,事情就变得陌生了。
经过研究,我发现在没有管理员权限的情况下运行我的应用程序而不是获取:
“C:\ Program Data \ MyProgramName \ fileName.xml”我明白了 “C:\ Users \用户名\应用程序数据\本地\ VirtualStore \ ProgramData \ MyProgramName \ filename.xml中”
确实有一个文件存在于以前的安装中(我显然没有删除,因为我不知道它存在)。所以请指导我如何在没有管理员权限的情况下运行应用程序时停止此操作。我不想在VirtualStore文件夹中自动创建任何文件。请讨论阻止这种情况的所有可能方法。感谢
答案 0 :(得分:4)
首先,问问自己,是否需要为所有用户全局保存?
如果不是,则将文件保存在Application Data中,您可以使用Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
获取路径,它应始终可靠地扩展到C:\Users\Username\AppData\Roaming\
。请注意,此路径对于每个用户都是唯一的。
如果必须,你运气不好。在没有管理员权限(或UAC)的情况下,没有管理员权限(或UAC)存储应用程序数据的可行方法没有非常严重,例如将数据存储在公共用户中(这可能是也可能是不可能的,我可以'现在检查)。
答案 1 :(得分:0)
解决此问题的一种方法是使用Environment.SpecialFolder.CommonApplicationData
位置,但有一些非常重要的警告和设置。
CommonApplicationData
是
用作通用存储库的目录 所有用户使用的特定于应用程序的数据。
另一个SO答案中给出了重要的要求和限制:https://stackoverflow.com/a/22107884/3195477
其中一部分说:
推荐的解决方案是供您的安装程序创建一个子目录 您共享存储的C:\ ProgramData目录。而那个子 安装程序必须为目录提供允许的ACL。 这就是授予所有标准用户所需访问权限的原因。
否则,以标准用户权限运行的程序仍然不能完全平等地为所有用户在该位置读取/写入文件。
答案 2 :(得分:-1)
在将一个非常古老的win32应用程序转移到Windows 7和Windows 7时,我找到了解决此问题的方法。 10.程序写入C:\ Program Files的数据库......但操作系统自动更改了虚拟存储的路径。但是,全球需要数据库。通过将compatablilty模式更改为Windows 95或XP SP2并始终以管理员身份运行,数据库直接在C:\ Program Files \ etc中工作。
对此存在安全隐患,并且禁用所有网络和适配器等框。