Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

  • Легко сделать. Не нужно знать какие-либо вызовы Windows API. Вам просто нужно знать интерфейс ввода-вывода файлов вашего языка программирования.
  • Портативный. Если вы переносите приложение на другую ОС, вам не нужно изменять свой формат настроек.
  • Пользователь редактируемые. Пользователь может редактировать файл конфигурации за пределами выполняемой программы.

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

  • Secure. Пользователь не может случайно удалить файл конфигурации или испортить данные, если он не знает о regedit. И тогда пользователь просто просит неприятностей.
  • Я не эксперт по программированию Windows, но я уверен, что использование реестра облегчает работу с другими предметами Windows (пользовательские настройки, сетевое администрирование, например групповая политика или что-то еще).

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

Ответ 2

Jeff Atwood имеет отличную статью о реестре Windows и почему лучше использовать файлы .INI.

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

  • Реестр - это единственная точка отказа. Поэтому каждый совет по редактированию реестра, который вы когда-либо найдете, начинается с большого толстого кричащего оговорки о том, как вы можете сломать свой компьютер с помощью regedit.
  • Реестр непрозрачный и двоичный. Насколько мне не нравится налог с угловыми скобками, по крайней мере XML файлы конфигурации достаточно удобочитаемы для человека, и они позволяют столько комментариев, сколько сочтет нужным.
  • Реестр должен быть синхронизирован с файловой системой. Удалите приложение без "удаления" его, и вы останетесь с устаревшим реестром. Или, если приложение имеет плохо написанный деинсталлятор. Файловая система больше не является выражением о записи - ее нужно как-то синхронизировать с реестром. Это полное нарушение принципа DRY.
  • Реестр монолитный. Скажем, вы хотели перенести приложение на другой путь на свой компьютер или даже на другую машину. Удачи, извлекая соответствующие настройки для одного конкретного приложения из гигантского реестра tarball. У данного приложения обычно есть десятки настроек, разбросанных по всему реестру.

Ответ 3

В соответствии с документацией для GetPrivateProfileString, вы должны использовать реестр для хранения информации о инициализации.

Однако при этом, если вы все еще хотите использовать .ini файлы и использовать стандартные API-интерфейсы профиля (GetPrivateProfileString, WritePrivateProfileString и т.п.) для доступа к ним, они предоставляют встроенные способы автоматического предоставить "виртуальные файлы .ini", поддерживаемые реестром. Беспроигрышная!

Ответ 4

Здесь есть аналогичный вопрос который охватывает некоторые из плюсов и минусов.

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

Ответ 5

Использование ini файла в том же каталоге, что и приложение, позволяет создать резервную копию приложения. Поэтому после перезагрузки ОС вы просто восстанавливаете каталог приложения, и у вас есть конфигурация так, как вы хотите.

Ответ 6

Есть еще одно преимущество использования INI файла над реестром, о котором я не упоминал: Если пользователь использует какое-то шифрование на основе томов и файлов, они могут легко зашифровать файл INI. С реестром это, вероятно, будет более проблематичным.

Ответ 7

Я согласен с Даниэлем. Если это большое приложение, я думаю, что делаю что-то в реестре. Если это небольшое приложение, и вы хотите, чтобы его аспекты были настроены пользователем без создания формы конфигурации, перейдите к быстрому 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 overwritten.
        config[kvPair[0].Trim()] = kvPair[1].Trim();
    }
}

Изменить: Извините, я думал, что вы указали язык. Реализация выше находится на С#.

Ответ 8

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

Ответ 9

Существующие ответы охватывают много оснований, но я думал, что упомянул еще один момент.

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

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

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

Например, скажем, программа A и программа B указывают на одну и ту же базу данных. У вас может быть "системный" параметр реестра для строки подключения. Если вы хотите указать другую базу данных, вы можете изменить строку соединения в одном месте, и обе программы будут выполняться в другой базе данных.

Примечание. Нет смысла использовать реестр таким образом, если двум или более программам не нужно использовать одни и те же значения. Например, программа A и программа B, которым требуется строка подключения к базе данных, может быть одинаковой, но не всегда. Например, я хочу, чтобы программа B теперь использовала тестовую базу данных, но программа A должна продолжать работать с производственной базой данных.

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

Ответ 10

Реестр оптимизирован для быстрого доступа и простого обновления, и это единственный способ выполнить определенные действия, связанные с Windows, такие как привязка к расширению. И вы можете игнорировать аргумент об удалении одного каталога для удаления вашей программы - Windows Vista не позволит вам изменять файлы в папке Program Files, поэтому ваша конфигурация должна будет идти в другой папке в любом случае.

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

Тем не менее, я вижу привлекательность файла INI, и я бы никого не обвинял в этом.

Ответ 11

Существует один недостаток файлов ini или config и их поиск, если у пользователя есть возможность выбрать, где установлена ​​программа.

Ответ 12

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

Если вы пишете системное программное обеспечение (службы Windows, драйверы устройств, компоненты COM... т.е. программное обеспечение, которое "близко к машине"), то реестр, вероятно, то, что вам нужно. Конфигурационные файлы хорошо сочетаются с пользовательским интерфейсом - особенно там, где пользователь может захотеть или ему нужно контролировать внешний вид.

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

Мой совет: в качестве новичка используйте простой конфигурационный файл; Есть множество примеров, и когда вы хотите скрыть или защитить свои настройки, изучите реестр.

Ответ 13

Другой недостаток использования реестра заключается в том, что если вы работаете в смешанной среде с 32- и 64-разрядными приложениями, это является \Wow6432Node\, так как системный вызов для доступа к реестру случайным образом (*) добавляет \Wow6432Node\ к вашему пути в реестре, делая вас сумасшедший во время отладки.

(* конечно не случайно, но очень легко заблудиться)

Ответ 14

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