在我的应用程序中,我需要在已知且可预测的位置存储“全局”(即非特定于用户)的设置。
我希望应用程序能够从任何地方(作为标准用户,而不是管理员)运行,包括来自不同位置的多个副本,并且能够读取和写入保存的配置文件。
数据需要为所有标准用户授予读写访问权限,而不仅仅是一个。
考虑到这一点,这里提到的四个选项是不合适的: http://msdn.microsoft.com/en-us/library/bb206295(VS.85).aspx#ID0E1BA
那么我的替代方案是什么?
我的应用程序是用C ++编写的,仅适用于Windows。我需要支持Windows XP及更高版本。
感谢。
编辑:
澄清一下,忽略由多个实例引起的竞争条件。这个问题仅与存储数据的位置有关。我看不到任何适合的地方:
答案 0 :(得分:2)
如果您认为CSIDL_COMMON_APPDATA
不合适(可能CSIDL_COMMON_APPDATA
是一个很好的默认值,但您希望管理员能够更改位置),您可以让安装程序写一些内容HKLM\SOFTWARE\<your app subkey>
表示将保存数据的公共目录的所需路径。
将指针放在HKLM注册表中的替代方法是使配置文件驻留在程序目录中,该目录具有指向共享目录的指针。根据定义,程序目录必须由安装程序写入,管理员可以写入(可能负责修改配置),并且用户可以读取。因此,标准用户可以读取一个众所周知的位置(HKLM子键或程序目录中的配置文件)来获取指向所有标准用户可写的目录的指针。
无论设置公共目录(安装程序或配置模块),都需要确保为标准用户写入正确设置公共目录的ACL。
答案 1 :(得分:1)
尝试用户个人资料目录中的公共文件夹:
CSIDL_COMMON_DOCUMENTS
编辑:或者使用
CSIDL_COMMON_APPDATA
但如果可能,请将权限设置为Authenticated Users组。
答案 2 :(得分:1)
您可能正在寻找CSIDL_COMMON_APPDATA。如果你选择任何Windows徽标认证,IIRC也应该是一个不错的选择。如果它不符合您的要求,请检查this link on MSDN,您应该能够找到最符合您需求的产品。
祝你好运。
答案 3 :(得分:1)
你能不能只使用固定的目录名,例如C:\ FixedDataForYourProgram
我们在XP上这样做。我没有在Vista / Win7上以编程方式尝试,但是在Vista上以标准用户身份登录我在root下创建目录没有问题。
我确信这会违反各种规则,但这很简单。我喜欢简单。
答案 4 :(得分:-2)
选项: