Я работаю над настольным приложением с графическим интерфейсом, которое должно работать в 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.)
Редактировать:
Под «предпочтениями» я подразумеваю данные, которые могут быть изменены приложением и пользователем, например, список последних файлов, предпочтительный размер окна и так далее.
Я также разрабатываю набор кроссплатформенных плагинов и сделал именно то, что вы описываете в методе (B):
Я также хотел бы отметить, что:
~/Library/Preferences
папки, но лучше использовать их API для сохранения значения настроек. По сути, это превращает предпочтения в механизм, подобный реестру. Я очень возмущен этим подходом.Я не знаю ни одной библиотеки, которая реализует поиск нужной папки в кросс-платформенной манере. Как вы описали, такую функцию не очень сложно написать с использованием SHGetKnownFolderPath и NSSearchPathForDirectoriesInDomains.
Поскольку 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. Но вы не должны беспокоиться об этом.