Где я должен хранить настройки приложения? - PullRequest
14 голосов
/ 25 ноября 2010

Меня попросили обновить приложение 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 вопроса:

  1. Учитывая все эти папки, где я могу хранить свои настройки?
  2. Я предполагаю, что есть отличный вызов Windows API, который бы дал мне правильное местоположение этой папки. И я надеюсь, что это работает как на XP, так и на 7. Верно ли мое предположение? Если это так, ссылка будет высоко ценится.

Ответы [ 3 ]

12 голосов
/ 25 ноября 2010

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

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

Я бесстыдно скопировал приведенное выше объяснение из хорошей статьи Карла Петерсона, объясняющей это для программистов VB6.У Карла также есть готовый к использованию класс , который поможет вам найти каталоги, но, на мой взгляд, на этот раз он слишком сложен. Боб Римерсма имеет лучший способ в одну строку , используя объект Shell , как показано ниже. EDIT Комментарий Боба ниже объясняет, почему для этого лучше использовать позднее связывание , а не раннее связывание .

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

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

На мой взгляд, этов порядке продолжать использовать файлы INI в этих каталогах.

7 голосов
/ 25 ноября 2010

См. Вопрос " Есть ли у Microsoft документ с рекомендациями по хранению данных приложений? " для получения некоторой полезной информации.

1 голос
/ 22 сентября 2012

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

...