Реестр противINI-файл для хранения настраиваемых пользователем настроек приложения

StackOverflow https://stackoverflow.com/questions/6607

Вопрос

Я начинающий программист Windows, и я не уверен, где мне следует хранить настраиваемые пользователем параметры приложения.Я понимаю необходимость предоставления пользователю удобных средств для изменения настроек приложения, таких как форма редактирования | Настройки или аналогичная.Но где я должен хранить значения после того, как пользователь нажмет кнопку Применить в этой форме?

Каковы плюсы и минусы сохранения настроек в реестре Windows по сравнению схранить их в локальном INI-файле, конфигурационном файле или подобном?

Это было полезно?

Решение

Плюсы конфигурационного файла:

  1. Это легко сделать.Вам не нужно знать никаких вызовов Windows API.Вам просто нужно знать интерфейс файлового ввода-вывода вашего языка программирования.
  2. Портативный.Если вы переносите свое приложение на другую ОС, вам не нужно изменять формат настроек.
  3. Доступно для редактирования пользователем.Пользователь может редактировать конфигурационный файл вне процесса выполнения программы.

Плюсы реестра:

  1. В безопасности.Пользователь не может случайно удалить конфигурационный файл или повредить данные, если он / она не знает о regedit.И тогда пользователь просто напрашивается на неприятности.
  2. Я не опытный программист 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 есть один недостаток, и он заключается в их размещении, если у пользователя есть возможность выбрать, где установлена программа.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top