Реестр противINI-файл для хранения настраиваемых пользователем настроек приложения
-
08-06-2019 - |
Вопрос
Я начинающий программист Windows, и я не уверен, где мне следует хранить настраиваемые пользователем параметры приложения.Я понимаю необходимость предоставления пользователю удобных средств для изменения настроек приложения, таких как форма редактирования | Настройки или аналогичная.Но где я должен хранить значения после того, как пользователь нажмет кнопку Применить в этой форме?
Каковы плюсы и минусы сохранения настроек в реестре Windows по сравнению схранить их в локальном INI-файле, конфигурационном файле или подобном?
Решение
Плюсы конфигурационного файла:
- Это легко сделать.Вам не нужно знать никаких вызовов Windows API.Вам просто нужно знать интерфейс файлового ввода-вывода вашего языка программирования.
- Портативный.Если вы переносите свое приложение на другую ОС, вам не нужно изменять формат настроек.
- Доступно для редактирования пользователем.Пользователь может редактировать конфигурационный файл вне процесса выполнения программы.
Плюсы реестра:
- В безопасности.Пользователь не может случайно удалить конфигурационный файл или повредить данные, если он / она не знает о regedit.И тогда пользователь просто напрашивается на неприятности.
- Я не опытный программист Windows, но я уверен, что использование реестра упрощает выполнение других специфичных для Windows функций (пользовательские настройки, администрирование сети, например, групповая политика, или что-то еще).
Если вам просто нужен простой способ хранения конфигурационной информации, я бы порекомендовал файл конфигурации, используя INI или XML в качестве формата.Я предлагаю использовать реестр только в том случае, если есть что-то конкретное, от чего вы хотите избавиться с помощью реестра.
Другие советы
У Джеффа Этвуда отличный Статья о реестре Windows и почему лучше использовать вместо него файлы .INI.
Моя жизнь была бы намного проще, если бы настройки для каждого приложения хранились в таком месте, где я мог бы легко просматривать их, манипулировать ими и создавать резервные копии.Например, скажем...в INI-файлах.
- Реестр представляет собой единственная точка отказа.Вот почему каждый совет по редактированию реестра, который вы когда-либо найдете, начинается с большого кричащего заявления об отказе от ответственности о том, как вы можете сломать свой компьютер с помощью regedit.
- Реестр является непрозрачный и бинарный.Как бы мне ни не нравился налог на угловые скобки, по крайней мере, конфигурационные файлы XML достаточно удобочитаемы для человека и допускают столько комментариев, сколько вы сочтете нужным.
- Реестр должен быть синхронизирован с файловой системой.Удалите приложение, не "деинсталлируя" его, и вы останетесь с устаревшим реестром.Или если в приложении плохо написан деинсталлятор.Файловая система больше не является оператором записи - ее нужно каким-то образом синхронизировать с реестром.Это полное нарушение принципа DRY.
- Реестр является монолитный.Допустим, вы хотели переместить приложение по другому пути на своем компьютере или даже вообще на другой компьютер.Удачи в извлечении соответствующих настроек для этого конкретного приложения из гигантского архива реестра.Данное приложение обычно имеет десятки настроек, разбросанных по всему реестру.
В соответствии с документацией для GetPrivateProfileString Получить приватную строку, вы должны использовать реестр для хранения информации об инициализации.
Однако, при этом, если вы все еще хотите использовать файлы .ini и использовать стандартные API профилей (GetPrivateProfileString
, WritePrivateProfileString
, и т.п.) Для доступа к ним они предоставляют встроенные способы автоматического предоставления "виртуальных файлов .ini", поддерживаемых реестром.Беспроигрышный вариант!
Есть похожий вопрос здесь это включает в себя некоторые плюсы и минусы.
Я бы посоветовал не использовать реестр, если только ваше приложение в нем не нуждается.Насколько я понимаю, Microsoft пытается препятствовать использованию реестра из-за гибкости файлов настроек.Кроме того, я бы не рекомендовал использовать файлы .ini, а вместо этого использовать некоторые из встроенная функциональность Для.Сеть для сохранения настроек пользователя / приложения.
Использование ini-файла, находящегося в том же каталоге, что и приложение, позволяет создать его резервную копию вместе с приложением.Таким образом, после перезагрузки вашей операционной системы вы просто восстанавливаете каталог приложений, и ваша конфигурация становится такой, какой вы хотите.
Есть еще одно преимущество использования INI-файла вместо реестра, о котором я не упоминал:Если пользователь использует какое-либо шифрование на основе тома / файла, он может довольно легко зашифровать INI-файл.С реестром это, вероятно, будет более проблематично.
Как указал Дэниел, хранение конфигурационных данных в реестре дает вам возможность использовать шаблоны администратора.То есть вы можете определить шаблон администратора, использовать его в групповой политике и управлять конфигурацией вашего приложения по всей сети.В зависимости от характера приложения, это может стать большим благом.
Я согласен с Дэниелом.Если это большое приложение, я думаю, я бы сделал что-то в реестре.Если это небольшое приложение, и вы хотите, чтобы некоторые его аспекты настраивались пользователем без создания формы конфигурации, воспользуйтесь быстрым INI-файлом.
Обычно я выполняю синтаксический анализ следующим образом (если формат в файле .ini равен option = value, по 1 на строку, комментарии начинаются с #):
static void Parse()
{
StreamReader tr = new StreamReader("config.ini");
string line;
Dictionary<string, string> config = new Dictionary<string, string>();
while ((line = tr.ReadLine()) != null)
{
// Allow for comments and empty lines.
if (line == "" || line.StartsWith("#"))
continue;
string[] kvPair = line.Split('=');
// Format must be option = value.
if (kvPair.Length != 2)
continue;
// If the option already exists, it's overwritten.
config[kvPair[0].Trim()] = kvPair[1].Trim();
}
}
Редактировать:Извините, я думал, вы указали язык.Приведенная выше реализация выполнена на C#.
Реестр оптимизирован для быстрого доступа и простого обновления, и это единственный способ выполнять определенные действия, специфичные для Windows, например, связываться с расширением.И вы можете проигнорировать аргумент об удалении одного каталога для удаления вашей программы - Windows Vista не позволит вам изменять файлы в каталоге Program Files, поэтому вашу конфигурацию в любом случае нужно будет поместить в другую папку.
Существует общее руководство по программированию под Windows - делайте все так, как от вас ожидает Microsoft, и ваша жизнь станет намного проще.
Тем не менее, я вижу привлекательность INI-файла, и я бы никого не стал винить за его рассмотрение.
Существующие ответы охватывают много вопросов, но я подумал, что хотел бы упомянуть еще один момент.
Я использую реестр для хранения общесистемных настроек.То есть, когда 2 или более программам требуется точно такая же настройка.Другими словами, настройка, общая для нескольких программ.
Во всех остальных случаях я использую локальный конфигурационный файл, который находится либо по тому же пути, что и исполняемый файл, либо на один уровень ниже (в каталоге конфигурации).Причины уже рассмотрены в других ответах (переносимость, может быть отредактирована с помощью текстового редактора и т.д.).
Зачем вносить общесистемные настройки в реестр?Ну, я обнаружил, что если настройка является общей, но вы используете локальные конфигурационные файлы, то в конечном итоге вы дублируете настройки.Это может означать, что в конечном итоге вам потребуется изменить настройку в нескольких местах.
Например, скажем, программа A и программа B указывают на одну и ту же базу данных.У вас может быть "общесистемная" настройка реестра для строки подключения.Если вы хотите указать на другую базу данных, вы можете изменить строку подключения в одном месте, и теперь обе программы будут работать с другой базой данных.
Примечание - нет смысла использовать реестр таким образом, если двум или более программам не обязательно использовать одни и те же значения.Например, Программе A и Программе B требуется строка подключения к базе данных, которая мочь будь таким же, но не всегда.Например, я хочу, чтобы программа B теперь использовала тестовую базу данных, но программа A должна продолжать использовать производственную базу данных.
В приведенном выше примере у вас может быть некоторая локальная конфигурация, переопределяющая общесистемные настройки, но это может стать чрезмерно сложным для простых задач.
У файлов ini или config есть один недостаток, и он заключается в их размещении, если у пользователя есть возможность выбрать, где установлена программа.
Является ли ваше приложение тем, которое устанавливается вместе с программой установки, или оно просто "Извлекается и запускается"?В первом случае обратите внимание на плюсы и минусы, изложенные здесь.Но для извлечения и запуска реестр, на мой взгляд, является "запретным", поскольку люди ожидают, что смогут просто удалить папку приложения, чтобы избавиться от вашей программы.