Я работаю над настольным приложением 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:
Под «предпочтения» Я имею в виду, что данные могут быть изменены приложением и пользователь, например список последних файлов, предпочтительный размер окна и т. д.
Используйте JSON или XML. Другой вариант - использовать списки свойств: native на OS X, легко обрабатываемый в Linux и Windows с использованием libplist. –
@ H2CO3 Формат файлов для хранения не является моей проблемой. Проблема в том, где хранить эти файлы? – z80crew
Вы всегда можете сохранить их в каталоге вместе с исполняемым файлом и добавить имя файла конфигурации в «.». чтобы скрыть это. Означает, что пользователь не видит загроможденный каталог, но его легко найти и остановить вашу программу, вставляя материал по всей файловой системе. –