2013-09-27 4 views
4

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

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

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

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

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

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

+0

Используйте JSON или XML. Другой вариант - использовать списки свойств: native на OS X, легко обрабатываемый в Linux и Windows с использованием libplist. –

+0

@ H2CO3 Формат файлов для хранения не является моей проблемой. Проблема в том, где хранить эти файлы? – z80crew

+1

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

ответ

1

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

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

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

  1. Использование реестра Windows, является весьма ограниченным и проблематичным. Я стараюсь избегать этого как можно больше.
  2. В последнее время у яблока появилась новая песня: вам не нужно напрямую обращаться к папке ~/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. Но вы не должны беспокоиться об этом.

+0

+1 для указания на Fl_Preferences, который действительно должен пригодиться для выполнения части хранения. Но я быстро просмотрел его исходный код и жестко кодирует путь, в котором он хранит настройки: 'sprintf (имя файла,«% s/Library/Preferences », fl_getenv (« HOME »));« Пока Apple не советует делая это, похоже, здесь много приложений. – z80crew