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

14

我被要求更新一个在WinXP上运行了6年的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

这些文件夹中的每一个都有子文件夹,似乎存储着各种产品的设置/文件。

那么有两个问题:

  1. 在这所有的文件夹中,我应该把我的设置文件存储在哪里?
  2. 我假设有一个很棒的Windows API调用可以给出此文件夹的正确位置。 我希望它能在XP和7上运行。我的想法正确吗?如果是,链接将不胜感激。

+1 但不要把它看作是一个关键的区别。即使在Windows Vista之前的版本中,您也可能不应该将数据写入共享的“Program Files”文件夹。 - Cody Gray
3个回答

12

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

  • CSIDL_APPDATA文件夹是您最感兴趣的一个。存储在此处的数据可供漫游用户在登录到任何机器时使用。这是存储简单配置数据的最佳位置。所有用户都可以对此(和最后一个)文件夹进行写访问。请注意,以上任何文件夹都不适用于用户生成的数据!这应该属于“我的文档”层次结构。
  • 编辑:如Cody Gray在评论中建议的那样,还要考虑CSIDL_LOCAL_APPDATA用于始终针对当前机器本地的应用程序数据,但是以每个用户为基础设置。此文件夹中的数据不能漫游,因此应该是用户在登录到其他计算机时可能不会错过的数据。

我毫不羞愧地从Karl Peterson的好文章中抄袭了上面的解释,为VB6程序员解释了这个问题。Karl还有一个可直接使用的类,可以帮助您找到目录,但在我看来,他这次过于复杂了。Bob Riemersma用一行更好的方法,使用Shell对象,如下所示。编辑 Bob在下面的评论中解释了为什么最好使用late binding而不是early binding

Const ssfCOMMONAPPDATA = &H23 
Const ssfLOCALAPPDATA = &H1c
Const ssfAPPDATA = &H1a
Dim strAppData As String 
 
strAppData = _ 
    CreateObject("Shell.Application").NameSpace(ssfAPPDATA).Self.Path 

在我看来,在这些目录中继续使用INI文件是可以的。


3
CSIDL_APPDATA 是你应该使用的文件夹。然而,对于不希望漫游用户的设置,请考虑使用 CSIDL_LOCAL_APPDATA - Cody Gray
4
我想提醒一下,尽管在代码中添加对Shell库的引用并使用早期绑定(这样就可以使用所有Shell特殊文件夹的常量),看起来可能很聪明,但是微软没有仔细保留Shell32.dll的COM接口的二进制兼容性。因此,在这种情况下要坚持使用后期绑定,因为您的程序不会在紧密循环中调用它,所以性能不是问题。 - Bob77
@Bob 很好了解。我其实一直在想为什么马克发布了一个晚期绑定的示例并计划使用早期绑定。那将会是一个有趣的错误调试。 - AngryHacker
1
请注意,可以安全地引用Shell Controls和Automation来获取这些特殊文件夹常量,而无需手动编写Consts。只需避免在此处使用As New,并将任何引用变量声明为Object即可。 - Bob77

7

2
也许你只是在Windows注册表中保存了设置? 这很容易。使用SaveSetting和GetSetting比创建INI文件更容易。 而且兼容性没有问题,从WinNT到Windows 8都可以使用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接