2008-08-09 70 views
42

我是一名新的Windows程序員,我不確定應該在哪裏存儲用戶可配置的應用程序設置。我明白需要爲用戶提供一種用戶友好的方式來更改應用程序設置,如Edit |設置表單或類似。但是,在用戶點擊該表單上的應用按鈕後,我應該在哪裏存儲這些值?用於存儲用戶可配置應用程序設置的註冊表與INI文件

在Windows註冊表中存儲設置與將其存儲在本地INI文件或配置文件或類似文件中有什麼優勢和缺點?

回答

37

優點配置文件:

  1. 容易做到的。不需要知道任何Windows API調用。你只需要知道你的編程語言的文件I/O接口。
  2. 便攜式。如果將應用程序移植到另一個操作系統,則不需要更改設置格式。
  3. 用戶可編輯。用戶可以在程序執行之外編輯配置文件。

優點註冊表:

  1. 安全。用戶不會意外刪除配置文件或破壞數據,除非他/她知道註冊表。然後用戶只是在尋求麻煩。
  2. 我不是專家的Windows程序員,但我確定使用註冊表可以更輕鬆地完成其他特定於Windows的操作(用戶特定設置,網絡管理等組策略或其他任何內容)。

如果你只是需要一個簡單的方式來存儲配置信息,我會推薦一個配置文件,使用INI或XML作爲格式。我建議只有在某些特定的東西需要退出使用註冊表時才使用註冊表。

+3

JSON是當今簡單數據文件的另一種廣泛使用的格式。 – jpmc26 2014-08-22 18:55:00

+2

缺點:重新安裝新鮮的windows不要殺死ini文件。一個集中的數據庫需要被互斥,而且我們在這裏並沒有談論Oracle的多層次可回滾事務的質量。清潔/防病毒工具喜歡混亂人們的註冊表,而不是散佈的ini文件。註冊表只是文件系統中的一個文件系統,這是一個反模式http://en.wikipedia.org/wiki/Inner-platform_effect ... – 2015-01-08 05:40:55

+1

INI文件是一個更好的系統。成功啓動時的應用程序可以簡單地保存INI的備份以防止損壞。 – Mario 2015-01-16 21:12:55

4

根據GetPrivateProfileString的文檔,您應該使用註冊表來存儲初始化信息。然而,如果你仍然想要使用.ini文件,並使用標準配置文件API(GetPrivateProfileString,WritePrivateProfileString等)來訪問它們,它們提供了內置的方式來自動提供「虛擬.ini文件「由註冊表支持。雙贏!

4

還有一個類似的問題here,涵蓋了一些優點和缺點。

我會建議不要使用註冊表,除非你的應用程序絕對需要它。據我瞭解,由於設置文件的靈活性,微軟試圖阻止使用註冊表。另外,我不會推薦使用.ini文件,而是使用.Net中的一些built-in functionality來保存用戶/應用程序設置。

2

我同意丹尼爾。如果它是一個大型應用程序,我想我會在註冊表中做些事情。如果它是一個小應用程序,並且您希望在沒有配置表單的情況下擁有用戶可配置的方面,請轉到一個快速的INI文件。

我通常做這樣的解析(如果格式在。ini文件是選項=值,每行1,評論開始於#):

static void Parse() 
{ 
    StreamReader tr = new StreamReader("config.ini"); 
    string line; 
    Dictionary<string, string> config = new Dictionary<string, string>(); 

    while ((line = tr.ReadLine()) != null) 
    { 
     // Allow for comments and empty lines. 
     if (line == "" || line.StartsWith("#")) 
      continue; 

     string[] kvPair = line.Split('='); 

     // Format must be option = value. 
     if (kvPair.Length != 2) 
      continue; 

     // If the option already exists, it's overwritten. 
     config[kvPair[0].Trim()] = kvPair[1].Trim(); 
    } 
} 

編輯:對不起,我以爲你已經指定了語言。上面的實現在C#中。

+0

有一個[關於此問題的整個問題](http://stackoverflow.com/questions/217902/reading-writing-ini-file-in-c)(對於c#)。 – idbrii 2011-07-18 16:33:29

+0

https://docs.python.org/2/library/configparser.html – 2015-01-08 05:49:53

-2

是您的應用程序一個安裝有一個安裝程序,或只是「壓縮並運行」?在第一種情況下,請看這裏列出的優點和缺點。但對於解壓縮和運行,註冊表在我看來是一個「不要去」,因爲人們希望能夠簡單地刪除應用程序文件夾以擺脫您的程序。

2

正如Daniel指出的那樣,將配置數據存儲在註冊表中可讓您選擇使用管理模板。也就是說,您可以定義管理模板,在組策略中使用它並在整個網絡範圍內管理應用程序的配置。根據應用程序的性質,這可能是一大福音。

3

還有一分優勢,使用了我還沒有看到提到的註冊表INI文件: 如果用戶正在使用某種形式的基於卷/文件加密,他們可以得到INI文件很容易被加密。隨着註冊表,它可能會更成問題。

22

傑夫阿特伍德大約有Windows的註冊表中的一個偉大article爲什麼是更好地使用.ini文件來代替。如果每個應用程序的設置被存儲在一個地方,我可以很容易地看到他們,操縱它們,並將它們備份

我的生活將是一個很大的挫折感更容易。就像在INI文件中說的那樣。

  • 該註冊表是一個單點故障。這就是爲什麼你會發現每一個註冊表編輯技巧開始與一個大胖子尖叫的聲明關於如何使用註冊表打破你的計算機。
  • 註冊表是不透明和二進制。儘管我不喜歡尖括號徵稅,但至少XML配置文件是合理的人類可讀的,並且它們允許儘可能多的評論。
  • 註冊表必須是同步與文件系統。刪除一個沒有「卸載」它的應用程序,你只剩下過時的註冊表殘留。或者,如果應用程序寫入的卸載程序不好。文件系統不再是記錄聲明 - 它必須以某種方式與註冊表保持同步。這完全違反了DRY原則。
  • 註冊表是單片。假設您想要將應用程序移動到您計算機上的其他路徑,或者甚至完全移到其他計算機上。祝你好運,從巨大的註冊表tarball中提取那個特定應用程序的相關設置。一個給定的應用程序通常有幾十個設置遍佈註冊表。
1

註冊表被用於快速訪問和輕鬆更新優化,這是做某些Windows專用的東西像一個擴展相關聯的唯一途徑。而且您可以忽略關於刪除單個目錄以卸載程序的說法--Windows Vista不會允許您修改Program Files目錄中的文件,因此您的配置將不得不放在其他文件夾中。

有適用於Windows編程的通用指南 - 做事微軟希望你的方式,你的生活會方便很多。

這就是說,我可以看到INI文件的吸引力,我不會責怪任何人考慮它。

4

在與應用程序相同的目錄中使用ini文件,可以使用應用程序對其進行備份。因此,在重新加載操作系統後,只需恢復應用程序目錄即可,並且可以按照自己的需要進行配置。

-1

ini或配置文件有一個缺點,即如果用戶可以選擇安裝程序的位置,則可以找到它們。

1

現有的答案涵蓋了很多的理由,但我想我會提到另一點。

我使用註冊表來存儲系統範圍的設置。也就是說,當2個或更多程序需要完全相同的設置時。換句話說,一個設置由幾個程序共享。

在所有其他情況下,我使用本地配置文件,該文件位於與可執行文件相同的路徑或位於下一層(位於配置目錄中)的路徑中。原因已經在其他答案中介紹過了(便攜式,可以用文本編輯器等編輯)。

爲什麼要將系統範圍設置放入註冊表中?那麼,我發現如果一個設置是共享的,但你使用本地配置文件,你最終會重複設置。這可能意味着你最終需要在多個地方更改設置。

例如,假設程序A和程序B都指向同一個數據庫。您可以爲連接字符串設置「系統範圍」註冊表設置。如果你想指向一個不同的數據庫,你可以在一個地方更改連接字符串,並且這兩個程序現在將針對另一個數據庫運行。

注 - 如果兩個或多個程序不需要使用相同的值,則以這種方式使用註冊表沒有意義。例如,程序A和程序B都需要一個數據庫連接字符串,它們可以是可能是是相同的,但並不總是如此。例如,我希望程序B現在使用測試數據庫,但程序A應該繼續使用生產數據庫。

通過以上示例,您可以使用一些本地配置覆蓋系統範圍設置,但對於簡單任務它可能開始變得過於複雜。

相關問題