簡體   English   中英

如何在跨平台應用程序中存儲首選項(和用戶設置)?

[英]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)中的描述進行操作:

  1. 使用平台特定的代碼查找正確的文件夾。
  2. 使用跨平台代碼將首選項寫入該文件夾。

我還要指出:

  1. 使用Windows注冊表非常有限且有問題。 我盡量避免這種情況。
  2. 最近,Apple發行了一首新歌:您不應直接訪問~/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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM