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