[英]How to store preferences (and user settings) in a cross-platform application?
我正在一個GUI桌面應用程序上工作,該應用程序應在Windows,Mac OS X和Linux上本機運行。 在跨平台應用程序中存儲首選項的首選方法是什么? 我正在使用C ++,但是該問題(及其答案)對於任何本地編譯語言都應有效。 (有關動態語言和Java的解決方案,請參見此處 。)
到目前為止,我的研究告訴我,至少有兩種策略:
(A)使用特定於操作系統的API首選項功能。
(B)將首選項存儲在適當的(特定於OS的)文件夾中的文件中。
讓我們考慮方法(A):我假設NSUserDefaults
是Mac OS X的正確方法。在Windows系統上,我將通過RegOpenKeyEx
寫入注冊表。 但是,出現了一些問題:是否有與此相對應的可移植Linux API? 寫入Windows注冊表真的是可以應對未來的解決方案嗎?
為了簡單起見,我傾向於遵循方法(B)。 因此,我僅具有特定於操作系統的代碼即可獲取適當的目錄,在該目錄中,我可以按照自己選擇的格式存儲數據。 在Windows中,我學到SHGetFolderPath
(或SHGetKnownFolderPath
近期Windows系統)和CSIDL_LOCAL_APPDATA
是要走的路。 在Mac上, NSSearchPathForDirectoriesInDomains
API調用應該執行相同的操作; 盡管使事情變得更復雜,但它是一個Objective-C API。 最后,對於使用getenv("HOME")
(和getpwuid()
作為后備解決方案)的Linux版本,似乎是推薦的。
總結一下我的問題:
1.是否有任何模式被認為是此任務的最佳實踐?
2.是否有C ++類將所有骯臟的事物抽象化,例如找到正確的文件夾? (我遇到了QSetting ,但是我使用的是FLTK,我不想更改我的GUI工具包。)
編輯:
“首選項”是指可以由應用程序和用戶更改的數據,例如最近文件的列表,首選窗口大小等。
我還在開發一套跨平台插件,並且完全按照您在方法(B)中的描述進行操作:
我還要指出:
~/Library/Preferences
文件夾,而應使用其API保存首選項值。 實際上,這會將首選項轉換為類似注冊表的機制。 我非常討厭這種方法。 我不知道任何實現跨平台方式查找currect文件夾的庫。 如您所描述的,使用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構造函數傳遞的字符串相同。 但是您不應該為此擔心。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.