Файли 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 ;)
yannis

6

Мої переваги - XML-файли. Вони є ієрархічними, ви можете згорнути їх на свою волю практично будь-яким способом, який можна уявити, вони добре розуміються, незалежні від платформи, і існує широкий спектр програмного забезпечення для їх читання та запису.


6
Але жахливо багатослівний і, як правило, не читається після людини (думайте, не з відступом чи роздуттям до максимуму з деклараціями простору імен та іншими Bs).
Манджабес

1
@Manjabes: Характеристики, які навряд чи будуть істотними для файлів конфігурації.
Роберт Харві

@robert harvey: дуже важливо, де я живу. Для базового змішування з налаштуваннями ви використовуєте gui, а для розширених налаштувань перейдіть до редагування 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. Це, наприклад, коли ваша програма працює у вікнах режиму кіоску.


Можливо, вам знадобиться файл INI або ключ реєстру, щоб зберегти деталі підключення / рядок до бази даних
Клас Скелет

@CamelCase Inifile або ключ реєстру вже згадувались у запитанні, але не в базі даних. Я не хотів сказати, що ви не можете використовувати кілька методів одночасно.
Пітер Б

1

Мої особисті переваги - XML-файли:

У більшості випадків я не очікую, що користувачеві доведеться редагувати свої конфігураційні налаштування, тому проблема читабельності людини не є аргументом у цьому випадку.

Якщо вони потребують їх редагування, ви можете надати інструмент редагування - це заважає користувачеві щось робити з даними. Якщо вони хочуть відновити налаштування за замовчуванням, ви можете просто сказати їм видалити файл x, що більшість користувачів буде зручно робити.

Зверніть увагу, що ви все ще повинні бути обережними, щоб у вас був дозвіл на зберігання файлу, оскільки деякі локації не мають доступу для запису за замовчуванням у Windows 7 тощо.


Файли INI - це гарний стандартний спосіб зберігання конфігурації, який перевірений і протестований, але для мене вони просто "Windows 3.1"!

Мабуть, найкращий варіант, якщо ви хочете, щоб користувач міг розібратися зі своїми даними


Я б особисто відійшов від реєстру. З одного боку, ви не можете гарантувати, що користувач має необхідні дозволи на читання / запис, куди ви хочете зберігати свої дані.

У останніх ОС, де віртуалізація реєстру починає грати, це може спричинити велику плутанину, оскільки ви не можете "побачити" віртуалізовані налаштування - це не раз покусало нас, де витратили години, намагаючись з'ясувати, чому щось не працює.


3
Якщо ви переживаєте щодо дозволів на розташування реєстру, ви, ймовірно, намагаєтесь зберігати їх у неправильному місці. Користувач повинен мати дозволи на вулик HKey_Current_User, і ось тут повинні бути налаштування кожного користувача!
Ніл Уайт

@NeilWhite - погодився, що вони повинні мати дозволи, але надто ревний ІТ-адміністратор може змінити це (або дати читання / запис, але не створювати дозволи). Також ОП не згадувало, що ці параметри були обов'язково для кожного користувача , вони можуть бути на одній машині.
Метт Вілко

Також реєстр може мати обмеження розміру. Файли ні.
зв’язати
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.