我应该在哪里存储应用程序特定的设置?

Posted

技术标签:

【中文标题】我应该在哪里存储应用程序特定的设置?【英文标题】:Where should I store application specific settings? 【发布时间】:2011-05-15 11:27:50 【问题描述】:

我被要求更新过去 6 年来一直在 WinXP 上运行的 VB6 应用程序。客户想要使用 Windows 7。到目前为止,该应用程序将其设置存储在位于应用程序目录中的 INI 文件中。 XP 和 7 之间的一个关键区别是您不能再写信给C:\Program Files\AppFolder

我想弄清楚我应该在文件系统的哪个位置存储设置?鉴于该应用程序仍需要在 WinXP 上运行,我有点困惑。

在 WinXP 上,我有以下内容:

C:\Documents and Settings\profilename\Application Data
C:\Documents and Settings\profilename\Local Settings\Application Data

在 Windows 7 上,我有以下内容:

C:\Users\profilename\AppData\Local
C:\Users\profilename\AppData\LocalLow
C:\Users\profilename\AppData\Roaming

每个文件夹都有子文件夹,似乎存储各种产品的设置/文件

所以 2 个问题:

    鉴于所有这些文件夹,我在哪里存储我的设置? 我假设有一个漂亮的 Windows API 调用可以为我提供此文件夹的正确位置。我希望它适用于 XP 和 7。我的假设是否正确?如果是这样,一个链接将不胜感激。

【问题讨论】:

+1 但尽量不要将其视为关键区别。即使在 Windows Vista 之前的版本中,您也可能不应该写入共享的“程序文件”文件夹。 【参考方案1】:

您可以在 XP/Vista/Windows 7 上使用许多特殊文件夹:

CSIDL_APPDATA 文件夹可能是您最感兴趣的文件夹。此处存储的数据可供漫游用户在他们登录的任何计算机上使用。这是存储简单配置数据的最佳位置。所有用户都拥有对这个(也是最后一个)文件夹的写入权限。请注意,以上文件夹均不适用于用户生成的数据!那将适当地属于我的文档层次结构。 编辑: 正如 Cody Gray 在 cmets 中建议的那样,还可以考虑 CSIDL_LOCAL_APPDATA 用于始终位于当前计算机本地的应用程序数据,但会根据每个用户保留。此文件夹中的数据在漫游时不可用,因此应该是用户在登录到其他计算机时可能不会错过的数据。

我无耻地从 Karl Peterson 的 good article 中复制了上面的解释,为 VB6 程序员解释了这一点。 Karl 也有一个ready-to-use class 可以帮助您找到目录,但恕我直言,这次他的事情过于复杂了。 Bob Riemersma has a better way in one line,使用Shell object,如下所示。 编辑 Bob 在下面的评论解释了为什么最好使用后期绑定而不是早期绑定

Const ssfCOMMONAPPDATA = &H23 
Const ssfLOCALAPPDATA = &H1c
Const ssfAPPDATA = &H1a
Dim strAppData As String 

strAppData = _ 
    CreateObject("Shell.Application").NameSpace(ssfAPPDATA).Self.Path 

我认为在这些目录中continue to use INI files 很好。

【讨论】:

+1 CSIDL_APPDATA 是您可能应该使用的文件夹。但是,对于不应随用户漫游的设置,请考虑使用CSIDL_LOCAL_APPDATA 谢谢,这正是我所需要的。 我想补充一点,虽然添加对 Shell 库的引用并使用早期绑定(加上所有 Shell 特殊文件夹常量)似乎很聪明,但微软没有小心保留 Shell32.dll 的 COM 接口的二进制兼容性。坚持对此进行后期绑定,您的程序无论如何都不会在紧密循环中调用它,因此性能不是问题。 @Bob 很高兴知道。我实际上想知道为什么 Mark 发布了一个后期绑定示例并计划使用早期绑定。那将是一个有趣的调试错误。 请注意,引用 Shell 控件和自动化来获取这些特殊文件夹常量是足够安全的,而无需手动编码 Consts。只需在此处避免 As New 并将任何引用变量声明为 Object。【参考方案2】:

有关一些有用信息,请参阅问题“Does Microsoft have a best practices document regarding the storage of app data?”。

【讨论】:

【参考方案3】:

也许您只是将设置保存在 Windows 注册表中? 这很容易。使用 SaveSeting 和 GetSetting 比创建 INI 文件要容易得多。 并且兼容性没有问题,从WinNT到Windows 8。

【讨论】:

以上是关于我应该在哪里存储应用程序特定的设置?的主要内容,如果未能解决你的问题,请参考以下文章

我应该在哪里存储我的应用程序数据?

我应该在哪里存储我的应用程序的“激活”密钥?

Flask:设置应用程序和请求特定的属性?

我应该将图像存储在哪里,以便可以与它们共享 iTunes 文件?

使用 AWS Elastic Beanstalk 我应该在哪里存储我的应用程序代码?

如何在 Windows 中保存应用程序特定数据? [关闭]