Когда - и почему - следует хранить данные в реестре Windows?

Как разработчик, инструменты, которые хранят конфигурацию/параметры в реестре, являются бичем моей жизни. Я не могу легко отслеживать изменения этих параметров, не могу легко переносить их с машины на машину, и все это заставляет меня очень жаждать добрые старые .INI файлы...

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

Ответ 1

  • Первоначально (WIN3) конфигурация была сохранена в файле WIN.INI в каталоге Windows.
  • Проблема: WIN.INI стал слишком большим.
  • Решение (Win31): отдельные INI файлы в том же каталоге, что и программа.
  • Проблема: эта программа может быть установлена ​​в сети и доступна многим пользователям.
  • Решение (Win311): отдельные INI файлы в каталоге окна пользователя.
  • Проблема. Многие люди могут совместно использовать папку Windows, и она должна быть доступна только для чтения.
  • Решение (Win95): реестр с отдельными разделами для каждого пользователя.
  • Проблема: реестр стал слишком большим.
  • Решение (WinXP): большие блоки отдельных данных перемещены в пользовательскую папку данных приложения.
  • Проблема: хорошая для больших объемов данных, но довольно сложная для небольших объемов.
  • Решение (.NET): небольшое количество фиксированных данных только для чтения, хранящихся в файлах .config(Xml) в той же папке, что и приложение, с API для его чтения. (Чтение/запись или пользовательские данные остаются в реестре)

Ответ 2

Идя как с точки зрения пользователя, так и с точки зрения программистов, я должен сказать, что действительно действительно не очень важно использовать что-то в реестре, если это не что-то вроде ассоциаций файлов или конкретных машин.

Я пришел из школы мысли, в которой говорится, что программа должна быть запущена из любого места, где она установлена, что установка должна полностью перемещаться внутри машины или даже на другую машину и не влиять на ее работу.

Любые настраиваемые параметры или требуемые dll и т.д., если они не являются совместно используемыми, должны находиться в подкаталоге каталога установки, чтобы вся установка была легко перемещена.

Я использую много меньших утилит, таких как программы, поэтому, если он не может быть установлен на USB-накопителе и подключен к другой машине и просто запускается, то это не для меня.

Ответ 3

Политика Microsoft:

  • До Windows 95 мы использовали ini файлы для данных приложения.
  • В эпоху Windows 95 - XP мы использовали реестр.
  • В Windows Vista мы используем ini файлы, хотя теперь они основаны на xml.

Реестр зависит от машины. Мне это никогда не нравилось, потому что он медлил, и почти невозможно найти то, что вам нужно. Вот почему мне нравятся простые ini или другие файлы настроек. Вы знаете, где они находятся (папка приложения или папка пользователя), поэтому они легко переносятся и читаются человеком.

Ответ 4

Когда - вы вынуждены из-за устаревшей интеграции или потому, что ваш системный администратор говорит: "Это так" или потому, что вы разрабатываете более старый язык, что затрудняет использование XML.

Почему - прежде всего потому, что реестр не так переносим, ​​как копирование файла конфигурации, который сидит рядом с приложением (и называется почти таким же).

Если вы используете .Net2 +, у вас есть файлы App.Config и User.Config, и вам не нужно регистрировать DLL в реестре, поэтому держитесь подальше от него.

У конфигурационных файлов есть свои проблемы (см. ниже), но они могут быть закодированы и вы можете изменить свою архитектуру.

  • Проблема: приложениям необходимы настраиваемые параметры.
  • Решение. Сохраните настройки в файле (WIN.INI) в папке Windows. Используйте заголовки разделов для группировки данных (Win3.0).
  • Проблема: файл WIN.INI стал слишком большим (и запутался).
  • Решение. Сохраните настройки в файлах INI в той же папке, что и приложение (Win3.1).
  • Проблема: нужны пользовательские настройки.
  • Решение. Храните пользовательские настройки в пользовательских файлах INI в каталоге окна пользователя (Win3.11) или в отдельных разделах приложения в файле INI приложения.
  • Проблема: безопасность - некоторые параметры приложения должны быть доступны только для чтения.
  • Решение: Реестр с защитой, а также с пользовательскими и машинными разделами (Win95).
  • Проблема: реестр стал слишком большим.
  • Реестр: пользовательский реестр переместился в user.dat в пользовательскую папку "Данные приложения" и загружен только при входе в систему (WinNT).
  • Проблема. В крупных корпоративных средах вы заходите на несколько компьютеров и должны установить EACH ONE вверх.
  • Решение. Различия между локальными (локальными настройками) и профилями роуминга (Application Data) (WinXP).
  • Проблема: не удается xcopy развернуть или переместить приложения, как и остальные .Net.
  • XML файл APP.CONFIG в той же папке, что и приложение, - легко читается, легко манипулируется, легко перемещается, может отслеживать изменения (.Net1).
  • Проблема: все еще нужно хранить данные, специфичные для пользователя, с помощью аналогичного (например, xcopy).
  • XML файл USER.CONFIG в локальной или роуминговой папке пользователя и строго типизированном (.Net2).
  • Проблема: файлы CONFIG чувствительны к регистру (не интуитивно понятны для людей), требуют очень специфических "тегов" открытия/закрытия, строки подключения не могут быть установлены во время выполнения, проекты настройки не могут записывать настройки (так же легко, как реестр), не может легко определить файл user.config и пользовательские настройки, с каждой установленной новой версией.
  • Решение. Используйте элемент ITEM для установки строк подключения во время выполнения, введите код в классе Installer, чтобы изменить App.Config во время установки и использовать параметры приложения по умолчанию, если пользовательский параметр не найден.

Ответ 5

Будет ли мир заканчиваться, если вы сохраните несколько позиций окна и список последних используемых элементов в реестре Windows? Это работало хорошо для меня до сих пор.

HKEY-CURRENT-USER - отличное место для хранения тривиальных пользовательских данных в небольших количествах. Это для чего. Кажется глупым не использовать по прямому назначению только потому, что другие злоупотребляют им.

Ответ 6

Настройки, которые вы хотите иметь в профиле перемещаемого пользователя, должны, вероятно, попадать в реестр, если вы на самом деле не хотите приложить усилия для поиска папки данных приложения пользователя вручную.: -)

Ответ 7

Чтение и запись в реестре являются потокобезопасными, но файлов нет. Таким образом, это зависит от того, была ли ваша программа ничейной.

Ответ 8

Если вы разрабатываете новое приложение и заботитесь о переносимости, вы должны НИКОГДА хранить данные в реестре Windows, так как у другой ОС нет реестра (windows) (примечание duh - это может быть очевидно но часто упускается из виду).

Если вы только разрабатываете платформы Win... старайтесь избегать их как можно больше. Файлы конфигурации (возможно, зашифрованные) являются лучшим решением. Там нет выгоды в хранении данных в реестре - (изолированное хранилище - гораздо лучшее решение, например, если вы используете .NET).

Ответ 9

Немного не по теме, но поскольку я вижу людей, обеспокоенных переносимостью, лучшим подходом, который я когда-либо использовал, является класс Qt QSettings. Он абстрагирует хранение настроек (реестр в Windows, файл предпочтений XML в Mac OS и Ini файлы в Unix). Как клиент класса, мне не нужно тратить мозговой цикл на вопрос о реестре или что-то еще, это Just Works (tm).

http://doc.trolltech.com/4.4/qsettings.html#details

Ответ 10

Обычно, если вы не ставите настройки в реестр, вы используете его в основном для получения текущих настроек Windows, изменения ассоциаций файлов и т.д.
Теперь, если вам нужно определить, установлено ли ваше программное обеспечение, вы можете сделать минимальную запись в реестре, это местоположение, которое вы можете найти в любой конфигурации. Или найдите папку с заданным именем в Application Data.

Если я посмотрю папку "Мои документы и настройки", я вижу много программного обеспечения, использующего нотацию Unix для установки папок: .p4qt .sqlworkbench .squirrel-SQL .SunDownloadManager .xngr .antexplorer .assistant .CodeBlocks .dbvis .gimp-2.4 .jdictionary .jindent .jogl_ext (и т.д.)

и в Application Data - различные папки с именами редакторов или именами программ. Похоже, что это текущая тенденция, по крайней мере, среди переносных приложений...
WinMerge использует несколько иной подход, сохраняя данные в реестре, но предлагая импорт и экспорт параметров в диалоговом окне конфигурации.

Ответ 11

Лично я использовал реестр для хранения путей установки для использования скриптами (un). Я не уверен, что это единственный возможный вариант, но он казался разумным решением. Это было для приложения, которое, конечно, использовалось исключительно для Windows.

Ответ 12

В .NET там действительно НЕ нужна.

Вот два примера, которые показывают, как использовать Project proerties для этого.

Эти примеры делают это с помощью Windows Project Project Properties, но то же самое можно сделать и с помощью приложения.

Подробнее здесь:

http://code.msdn.microsoft.com/TheNotifyIconExample

http://code.msdn.microsoft.com/SEHE

Ответ 13

(поздно к обсуждению, но). Короткий ответ: групповая политика.

Если ИТ-отдел вашего клиента хочет установить параметры, связанные с Windows, или компоненты (или компоненты), которые вы пишете или добавляете, например скорость ссылки или настраиваемое сообщение об ошибке, или сервер базы данных для подключения к этому по-прежнему обычно выполняется с помощью групповой политики, что делает ее окончательным проявлением как настройки, хранящиеся в реестре. Такие политики применяются с момента запуска Windows или входа пользователя в систему.

Существуют инструменты для создания пользовательских шаблонов ADMX, которые могут сопоставлять настройки ваших компонентов в местах реестра и предоставлять администратору общий интерфейс для обеспечения соблюдения политиками (политиками), которые ему необходимо применять, показывая им только те параметры, которые имеют смысл для обеспечения соблюдения таким образом.

Ответ 14

Я считаю, что реестр Windows был хорошей идеей, но из-за большого злоупотребления со стороны разработчиков приложений и стандартных политик, которые не поощрялись/не утверждались Microsoft, превратились в неуправляемого зверя. Я ненавижу использовать его по причинам, о которых вы упомянули, однако есть некоторые случаи, когда имеет смысл использовать его:

  • Оставить след вашего приложения после удаления приложения (например, запомнить настройки пользователя в случае, если приложение установлено снова)
  • Обмен настройками конфигурации между различными приложениями - компонентами