我正在考慮爲應用程序添加可配置的設置,我認爲最簡單的方法是外部文件或贏註冊表(它是一個贏只應用程序)。應用程序設置方法? C++
哪種方式會更好?
我想知道,沒有足夠權限的用戶可能無法創建/寫入配置文件。而在註冊表的情況下,今天防病毒允許我添加/編輯/刪除密鑰?或者他們只監視某些鍵?另外,如果有人知道類/ lib來管理vC++中的配置設置(在純win32中),請發佈它。
我正在考慮爲應用程序添加可配置的設置,我認爲最簡單的方法是外部文件或贏註冊表(它是一個贏只應用程序)。應用程序設置方法? C++
哪種方式會更好?
我想知道,沒有足夠權限的用戶可能無法創建/寫入配置文件。而在註冊表的情況下,今天防病毒允許我添加/編輯/刪除密鑰?或者他們只監視某些鍵?另外,如果有人知道類/ lib來管理vC++中的配置設置(在純win32中),請發佈它。
據我所知:
沒有足夠權限的用戶可能無法創建/寫配置文件
你應該能夠讓內部用戶的「家庭檔案目錄「或」應用程序數據「目錄,無論權限如何。通常這些目錄應該是可寫的。
將今天的殺毒軟件允許我添加/編輯/刪除密鑰?
從未見過我的殺毒軟件會干擾註冊表操作。只要你沒有在註冊表中做任何可疑的事情,你可能會好起來的。
哪種方式會更好?
是味道的問題。我認爲文本文件更好 - 可以更輕鬆地遷移設置。只是不要在卸載後留下垃圾。
另外,如果有人知道一個類/ lib目錄來管理VC配置設置++
中的Qt 4。但使用Qt的全部只是保存設置QSettings絕對是矯枉過正。你也可以檢查JSON等配置語言,使用lua進行設置(比使用Qt 4更少矯枉過正)或者獲取任何XML庫。另外,直接使用註冊表或使用iostreams或stdio編寫配置文件不應該很難。如果你喜歡它,你可以隨時編寫自己的配置庫。
我認爲新的默認設置是在用戶的文件夾下的用戶的「AppData」文件夾中寫入一個配置文件,該文件夾應該可以安全地讀/寫。
我們使用一個簡單的XML格式文件來存儲設置;但您可以使用INI文件類型格式。
如果您將配置文件保存在應用程序數據目錄SHGetFolderPath()
與CSIDL_COMMON_APPDATA
中,所有用戶將能夠看到配置。如果您使用CSIDL_LOCAL_APPDATA
,則只有一個用戶能夠看到配置。註冊表不一定是保存所有配置數據的地方。
「僅限Windows」是限制還是限制解除?如果你不介意跨平臺,那麼我建議你給boost::program_options
一試。該庫通過命令行,通過環境變量和INI文件支持程序選項。 Boost的program_options
也很好地集成和粘貼了各種解析器與variables_map
,您可以將它們視爲選項及其值之間的映射。
對於簡單的東西,你可能只是使用註冊表。但是,配置文件有很多優點...您可以針對應用程序的不同用途保存/加載多個不同的配置,在用戶或計算機之間共享或遷移設置更加簡單等。
如果您最終去文件路徑,我會建議Boost的屬性樹庫:
http://www.boost.org/doc/libs/1_41_0/doc/html/property_tree.html
它有一個相當不錯的語法:
boost::property_tree::ptree properties;
std::string name = properties.get<std::string>("blah.name");
int score = properties.get<int>("blah.score");
properties.put("blah.name", "Inverse");
properties.put("blah.score", 1000);
它還支持讀取和寫入各種格式,如XML和其他。
+1:「我認爲文本文件更好 - 允許更輕鬆地遷移設置」對於生產應用程序,這是非常重要的考慮因素。可以導出和導入註冊表配置單元,但用戶通常不會得到這些信息,而且您可能不希望他們混淆註冊表 – 2010-05-27 16:33:13
這還取決於您要使用的語言。純C++不提供註冊表支持。閱讀和編寫文本文件都很困難。是的,你可以輕鬆地打開它們,但是如果你有大量的設置需要處理,解析和尋找值將成爲PITA。 如果你有訪問Win32/MFC/COM等,我會強烈建議去註冊表。讀取/寫入操作非常簡單,只需要幾行代碼。封裝在一個類中,你有一個非常優雅的可重用解決方案。 – Justin 2010-05-27 16:39:07