Где я должен хранить специальные настройки приложения?

Мне было предложено обновить приложение VB6, которое было запущено на WinXP в течение последних 6 лет. Клиент хочет использовать 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

Существует несколько специальных папок, которые вы можете использовать в XP/Vista/Windows 7:

  • Папка CSIDL_APPDATA - та, которую вы, вероятно, будете наиболее заинтересовать. Данные, хранящиеся здесь, доступны для перемещающихся пользователей на любом компьютере, в который они входят. Это лучшее место для хранения простых данных конфигурации. У всех пользователей есть доступ на запись к этой (и последней) папке. Обратите внимание, что ни одна из вышеперечисленных папок для пользовательских данных! Это должно принадлежать иерархии "Мои документы".
  • РЕДАКТИРОВАТЬ: Как предлагает Коди Грей в комментариях, также рассмотрите CSIDL_LOCAL_APPDATA для данных приложения, которые всегда будут локальными для текущего компьютера, но будут отложены для каждого пользователя. Данные в этой папке недоступны на основе роуминга, поэтому должны быть данные, которые пользователь, вероятно, не пропустит, если они войдут на другую машину.

Я бесстыдно скопировал приведенное выше объяснение из хорошей статьи Карла Петерсона, объяснив это для программистов VB6. У Карла также есть готовый к использованию класс, который поможет вам найти каталоги, но IMHO он слишком усложнил ситуацию на этот раз. Боб Римерсма имеет лучший способ в одной строке, используя объект Shell, так как ниже. РЕДАКТИРОВАТЬ. Комментарий Боба объясняет, почему лучше использовать позднюю привязку для этого, а не раннее связывание.

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

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

По-моему, это нормально, чтобы продолжать использовать INI файлы в этих каталогах.

Ответ 3

Возможно, вы просто сохранили свои настройки в реестре Windows? Это очень легко. Использование SaveSeting и GetSetting намного проще, чем создание INI файла. И нет никакой проблемы в совместимости, от WinNT до Windows 8.