Как сохранить настройки (и пользовательские настройки) в кроссплатформенном приложении?

Я работаю над настольным приложением с графическим интерфейсом, которое должно работать в Windows, Mac OS X и Linux. Каков предпочтительный способ хранения настроек в кроссплатформенном приложении? Я использую C ++, но вопрос (и его ответы) должен быть действительным для любого языка, скомпилированного на родном языке. (Решения для динамических языков и Java можно увидеть Вот.)

Мои исследования пока говорят мне, что есть как минимум две стратегии:
(A) Используйте специфичные для ОС функции настроек API.
(B) Сохраните настройки в файле в соответствующей (для конкретной ОС) папке.

Давайте рассмотрим метод (А): я предполагаю NSUserDefaults является правильным методом для Mac OS X. В системах Windows, я бы написал в реестр через RegOpenKeyEx, Но возникают некоторые вопросы: есть ли для этого сопоставимый и переносимый API для Linux? Является ли запись в реестр Windows действительно перспективным решением?

Для простоты я склонен следовать методу (B). Таким образом, у меня есть только специфичный для ОС код, чтобы получить соответствующий каталог, где я могу хранить свои данные в формате по своему выбору. На Windows я узнал SHGetFolderPath (или же SHGetKnownFolderPath для последних систем Windows) и CSIDL_LOCAL_APPDATA это путь. На Маках NSSearchPathForDirectoriesInDomains Вызов API должен сделать то же самое; это API-интерфейс Objective-C, хотя и усложняющий вещи. Наконец, для версии Linux, используя getenv("HOME") (а также getpwuid() как запасное решение), кажется, рекомендую.

Подводя итог моим вопросам:
1. Существуют ли какие-либо модели, которые считаются лучшими для этой задачи?
2. Есть ли какой-нибудь класс C ++, абстрагирующий все грязные вещи, такие как поиск нужной папки? (Я сталкивался QSetting, но я использую FLTK и не хочу менять свой инструментарий GUI.)

Редактировать:
Под «предпочтениями» я подразумеваю данные, которые могут быть изменены приложением и пользователем, например, список последних файлов, предпочтительный размер окна и так далее.

4

Решение

Я также разрабатываю набор кроссплатформенных плагинов и сделал именно то, что вы описываете в методе (B):

  1. Найдите нужную папку, используя код платформы.
  2. Запишите настройки в эту папку с кроссплатформенным кодом.

Я также хотел бы отметить, что:

  1. Использование реестра Windows очень ограничено и проблематично. Я стараюсь избегать этого как можно больше.
  2. В последнее время у Apple появилась новая песня: вы не должны ~/Library/Preferences папки, но лучше использовать их API для сохранения значения настроек. По сути, это превращает предпочтения в механизм, подобный реестру. Я очень возмущен этим подходом.

Я не знаю ни одной библиотеки, которая реализует поиск нужной папки в кросс-платформенной манере. Как вы описали, такую ​​функцию не очень сложно написать с использованием SHGetKnownFolderPath и NSSearchPathForDirectoriesInDomains.

1

Другие решения

Поскольку z80crew говорит, что он использует Fltk в своем проекте, я думаю, что лучший способ хранить небольшие объемы пользовательских данных — это использовать класс Fltk Fl_Preferences. (http://www.fltk.org/doc-1.3/classFl__Preferences.html).

Таким образом, вам не нужно заботиться о том, где пользовательские данные хранятся в файловой системе. Вы просто создаете объект Fl_Preferences, идентифицируемый по имени приложения и его поставщика (например, «CoolApp» и «AuthorOfCoolApp»), а Fltk хранит данные где-нибудь.

В Linux настройки хранятся в ~ / .fltk / {vendor} / {application} .prefs, где {vendor} и {application} — это те же строки, которые вы передали конструктору Fl_Preferences. Но вы не должны беспокоиться об этом.

1

По вопросам рекламы [email protected]