我需要一个通用的应用程序设置文件,我需要它在运行时由应用程序编辑。
我不想通过将“User”放在设置范围内来使用build in settings操作,因为它会保存在用户本地目录中。
另一方面,我不能将.config与“Application”一起使用,因为我无法从应用程序中保存到此文件中。
有人可能会说“创建你自己的存储设置XML文件很容易”..是的,但是我想知道在类中使用MS构建的常见可写配置文件的解决方案是什么?
答案 0 :(得分:3)
要拥有所有用户都可以更新的数据,那么所有用户都需要能够保存到容纳该数据的任何容器。
这适用于从文本文件到RDBMS的任何格式。
您管理的文件(例如.config
(XML)文件)的问题有两个:
ConfigurationManager
及其关联类将使用适用的配置元素和属性声明写入.exe.config
文件,但基础文件必须是可写的。你需要:
在安装程序中设置ACL,以便所有(适用的)用户都具有写访问权限。这意味着他们也可以在应用程序之外编写,这是不可避免的,因为无法根据应用程序设置访问控制。
在Program Files
之外安装。 UAC虚拟化写入Program Files
(因此假设所有用户都可以在任何地方写入的应用程序不会中断),但这也意味着它不能用于共享可修改数据。
并发是另一个问题。两个用户一起修改共享数据是什么?除非您在更改时实施某些锁定和重新加载,否则一个用户将覆盖其他更改。
考虑使用多用户数据库代替。它们是为这种事物而设计的,配置文件不是。
更新 (根据评论):
要让(非管理员)用户更新程序文件中的.exe.config
仍然会达到UAC虚拟化(即任何写入将被定向到每个用户的位置,而其他任何人都看不到)
更容易使用ConfigurationManager.OpenExeConfiguration(string)
方法从具有适当ACL的某个共享位置(例如.config
1 )加载C:\ProgramData
。返回的Configuration
对象具有.exe.config
对<appSettings>
隐式加载的所有功能以及自定义部分,以及对Save
和SaveAs
的访问权限。< / p>
1 当然使用正确的方法来获取实际的本地路径,而不是硬编码。