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

我被要求更新一个在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 

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

所以2个问题:

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

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

  • CSIDL_APPDATA文件夹是您可能最感兴趣的文件夹。此处存储的数据可供漫游用户在任何login到的机器上使用。 这是存储简单configuration数据的最佳位置。 所有用户都有对这个(和最后一个)文件夹的写入权限。 请注意,上述文件夹都不是用于用户生成的数据! 这将正确属于我的文档层次结构。
  • 编辑:正如科迪·格雷build议在评论中,也考虑CSIDL_LOCAL_APPDATA应用程序数据将永远是当地的机器,但是保留在每个用户的基础上。 该文件夹中的数据在漫游的基础上不可用,所以它应该是用户login到其他机器时不会错过的数据。

我无耻地从Karl Peterson的一篇很好的文章中复制了上面的解释,为VB6程序员解释了这一点。 卡尔也有一个准备好使用的类 ,将帮助你find目录,但恕我直言,他这是过于复杂的东西。 Bob Riemersma在一行中使用Shell对象 有一个更好的方法 ,如下所示。 编辑鲍勃的评论下面解释了为什么最好使用后期绑定 ,而不是早期绑定

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

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

查看问题“ Microsoft是否有关于应用程序数据存储的最佳实践文档? ”以获取一些有用的信息。

也许你只是保存在Windowsregistry中的设置? 这很容易。 使用SaveSeting和GetSetting比创buildINI文件要容易得多。 从WinNT到Windows 8,兼容性没有问题。