INI-файлы или реестр или личные файлы?


19

Я хочу сохранить конфигурацию моего проекта, которая включает в себя

  1. Размер экрана
  2. Положение экрана
  3. Пути к папкам
  4. Настройки пользователя и тд.

Стандартные места, где вы можете сохранить эти значения конфигурации:

  1. реестр
  2. INI файлы
  3. Личные файлы (например, * .cfg)

Как вы выбираете между этими местами? Кроме того, есть ли плюсы и минусы использования любого из них?


2
Какие инструменты вы используете? Некоторые технологии поставляются с довольно красивыми инструментами управления конфигурацией.

@ Pierre303 в настоящее время использует VS 2008 для VC ++
Shirish11

Нужно ли пользователям вносить изменения?
JeffO

1
Рассматривали ли вы YAML, вы получаете лучшее из обоих, ini и xml en.wikipedia.org/wiki/YAML
JF Dion

Ответы:


20

Также есть ли плюсы и минусы использования любого из них?

Реестр:

  • + Относительно стандарт в среде Windows.
  • + Как правило, хорошая поддержка от установщиков и т. Д.
  • - API для конкретной платформы, если вы хотите портировать свое приложение.
  • - Не особо удобочитаемый.

INI файлы:

  • + Простой формат
  • + Портативный.
  • + Человек читаемый.
  • - Может быть трудно хранить более сложную информацию (например, что-либо, вложенное глубиной более двух уровней).
  • ?Возможно, придется написать свой собственный синтаксический анализатор (хотя и не сложно) или использовать внешнюю библиотеку, такую ​​как SimpleIni (спасибо Джонатану Мерлету за комментарий).

XML-файлы (я предполагаю, что это опция .cfg):

  • + Стандартный формат.
  • + Портативный.
  • + Поддерживает глубоко вложенные структуры.
  • - Не особо удобочитаемый.

Лично для приложений Windows я склонен использовать C # и использовать личный файл для пользователя, хранящийся в формате XML. Я делаю это, как правило, потому что удобочитаемость не является приоритетом в типах приложений, которые я пишу (и в любом случае приложение должно иметь редактор конфигурации), а в среде .NET очень легко работать с XML. Я очень часто получаю объект UserConfiguration, который просто сериализуется в файл конфигурации и из файла конфигурации - практически не требуется разработка (анализ, преобразование содержимого), и ваша конфигурация готова для использования в строго типизированной среде.


Я использовал SimpleIni для разбора INI-файлов некоторое время назад, и он работал хорошо.
Джонатан Мерлет

@JonathanMerlet спасибо, я добавил SimpleIni к сообщению.
Даниэль Б.

15

Я бы пошел с INI-файлами, они более удобны для человека:

[window]
width       = 600
height      = 350
position.x  = 400
position.y  = 200

[paths]
path1       = "/some/random/path/"
path2       = "/some/other/random/path/"

[user]
name        = "Yannis"
preference  = "INI"

XML может быть хорошим вариантом, но он не может сравниться с простотой и элегантностью INI:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <window>
        <width>600</width>
        <height>350</height>
        <position>
            <x>400</x>
            <y>200</y>
        </position>
    </window>
    <paths>
        <path1>/some/random/path/</path1>
        <path2>/some/other/random/path/</path1>
    </paths>
    <user>
        <name>Robert</name>
        <preference>XML</preference>
    </user>
</configuration>

INI также очень хорошо поняты и независимы от платформы. Вероятно, для них не так много инструментов, как для файлов XML, потому что, ну кому нужен специализированный инструмент для чтения и редактирования файла INI?


2
Забавно, но я считаю, что XML выглядит лучше и легче для чтения. Для тех, кому не нравится многословие, JSON является подходящей альтернативой.
Роберт Харви

3
@RobertHarvey JSON Мне нравится (и я бы использовал, если бы мне нужно было более глубокое вложение), но XML на самом деле не моя чашка чая ...
yannis

2
XML можно сделать лучше, свернув значения в атрибуты. Например,<window width="600" height="350" />
Роберт Харви

Я на самом деле удивлен, что никто еще не упомянул YAML. Я чувствую, что он более дружественный к человеку, чем JSON, но довольно похож по возможностям и синтаксису. Сайт yaml.org, вероятно, отпугивает всех, кто еще не знаком с ним.
Даниэль Б.

@DanielB Кто-то упомянул YAML ;)
Яннис

6

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


6
Но ужасно многословны и, как правило, не читаются человеком (не думайте, что они с отступом или раздутием по максимуму с объявлениями пространства имен и другими символами b).
Манджабес

1
@Manjabes: характеристики, которые вряд ли будут важны для файлов конфигурации.
Роберт Харви

@ Роберт Харви: очень важно, где я живу. Для основного вмешательства в настройки вы используете графический интерфейс, для расширенных настроек вы идете редактировать INI.
Питер Б

6

Чтобы расширить предложение Джеффа о YAML , вот краткое введение.

YAML похож на JSON (на самом деле, JSON является подмножеством YAML начиная с версии 1.2 стандарта YAML и, следовательно, может корректно обрабатывать JSON анализаторами YAML). На первый взгляд, главное отличие состоит в том, что YAML (по умолчанию) использует отступы, а не скобки для отображения иерархии. Существует также заметное отсутствие кавычек для строк. Быстрый пример сверху:

configuration:
  window: 
    width:       600
    height:      350
    position:
      x:         400
      y:         200
  paths:
    path1:       some/random/path
    path2:       some/other/random/path
  user:
    name:        Joe Soap
    preference:  YAML

См . Страницу YAML Википедии для лучших примеров. Поддержка YAML существует для большинства основных языков ( подробности см. На yaml.org ).


3

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


Вам может понадобиться файл INI или ключ реестра для хранения сведений / строки соединения с базой данных
Class Skeleton

@CamelCase Inifile или раздел реестра уже упоминался в Вопросе, но не База данных. Я не хотел сказать, что вы не можете использовать несколько методов одновременно.
Питер Б

1

Мои личные предпочтения - файлы XML:

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

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

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


INI-файлы - это хороший стандартный способ хранения конфигурации, они проверены и опробованы, но они просто кажутся мне «Windows 3.1»!

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


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

В более поздних ОС, где виртуализация реестра вступает в игру, это может вызвать серьезную путаницу, потому что вы не можете «видеть» виртуализированные настройки - это укусило нас не раз, когда мы часами пытались выяснить, почему что-то не работает.


3
Если вас беспокоят разрешения для разделов реестра, вероятно, вы пытаетесь сохранить их не в том месте. У пользователя должны быть права доступа к кусту HKey_Current_User, и именно там должны быть настройки для каждого пользователя!
Нил Уайт

@NeilWhite - согласился, что у них должны быть разрешения, но слишком усердный ИТ-администратор может изменить это (или дать право на чтение / запись, но не создавать разрешения). Также ОП не упомянул, что эти настройки были обязательно для пользователя , они могут быть для каждой машины.
Мэтт Вилко

Кроме того, реестр может иметь ограничение по размеру. Файлы не.
Linquize
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.