2008-08-09 16 views
42

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

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

ответ

37

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

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

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

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

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

+3

JSON - это еще один широко используемый формат для простых файлов данных в настоящее время. – jpmc26 2014-08-22 18:55:00

+2

недостающие точки: переустановка свежих окон не убивает файлы ini. Централизованная база данных должна быть мьютексирована, и мы не говорим о качестве Oracle с транзакциями с несколькими уровнями. Чистые/антивирусные инструменты любят возиться с реестром людей, а не с разбросанными ini-файлами. реестр - это просто файловая система в файловой системе, это антипаттерн http: //en.wikipedia.org/wiki/Inner-platform_effect ... – 2015-01-08 05:40:55

+1

Файлы INI - лучшая система. Приложение при успешной загрузке может просто сохранить резервную копию INI для защиты от коррупции. – Mario 2015-01-16 21:12:55

4

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

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

4

Существует аналогичный вопрос here, который охватывает некоторые из «за» и «против».

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

2

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

Обычно я так разбираюсь (если формат в.ини файл опция = значение, 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(); 
    } 
} 

Edit: К сожалению, я думал, что вы указали язык. Вышеприведенная реализация находится в C#.

+0

Существует целый вопрос по этому вопросу (http://stackoverflow.com/questions/217902/reading-writing-ini-file-in-c) (для C#). – idbrii 2011-07-18 16:33:29

+0

https://docs.python.org/2/library/configparser.html – 2015-01-08 05:49:53

-2

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

2

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

3

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

22

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

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

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

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

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

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

4

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

-1

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

1

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

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

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

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

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

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

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