2008-08-25 123 views
52

我有一個.NET 2.0 Windows窗體應用程序。商店用戶設置的最佳位置在哪裏(考慮Windows指南)?有人指出Application.LocalUserAppDataPath。然而,創建一個文件夾結構,如:爲.NET應用程序存儲用戶設置的最佳方式是什麼?

C:\的Documents and Settings \用戶名\本地設置\應用 數據\ COMPANY_NAME \ PRODUCT_NAME \ PRODUCT_VERSION \

如果我發佈1的版本我應用程序並在其中存儲XML文件,然後發佈版本2,該版本將更改爲不同的文件夾,對嗎?無論應用程序版本如何,我都希望每個用戶都有一個文件夾來存儲設置。

+0

我覺得[這篇文章]涵蓋了解決方案。 – 2008-08-25 16:50:42

+0

[更新鏈接](https://blog.kowalczyk.info/article/10b/Getting-user-specific-application-data-directory.html)從Jorges評論。 – tm1 2016-05-19 09:39:06

回答

74

我喜歡使用內置的Application Settings。然後,你已經建立了使用設置設計器支持,如果你想在設計時,或在運行時使用:

// read setting 
string setting1 = (string)Settings.Default["MySetting1"]; 
// save setting 
Settings.Default["MySetting2"] = "My Setting Value"; 

// you can force a save with 
Properties.Settings.Default.Save(); 

它確實存儲在一個類似的文件夾結構設置爲你描述(與版本路徑)。然而,一個簡單的調用:

Properties.Settings.Default.Upgrade(); 

的應用將拉動所有先前版本的設置在保存

已經對我在過去的工作
+1

感謝您的升級()提示。 – 2008-09-19 20:20:27

1

設置是標準鍵值對(字符串字符串)。如果有幫助,我可以將它們包裝在一個XML文件中。

我寧願使用文件系統而不是註冊表。這似乎更容易維護。在支持情況下,如果用戶需要手動打開/更改設置,那麼如果它在文件系統中會更容易。

0

我會沿着您發佈的文件夾列表,除了產品版本。更新發布後,您不希望重置設置。

由於調試/佔用空間的因素,我實際上正在遠離用戶設置的註冊表。我目前只在註冊表中存儲的一些基本設置(窗口大小,位置,數據文件的版本),我如果更新變壞或用戶丟失了第二臺顯示器遇到更多的問題,而這正是該應用程序正在開放。他們中的一些人精通理解註冊表,但其餘的他們必須重新安裝,這很快,但我認爲他們有點抱怨。使用基於文件的版本,我所要做的就是讓他們在記事本中打開一個XML文件並進行快速調整。

此外,我正在尋找使我的應用程序可以運行在USB閃存驅動器上,並將設置綁定到文件中似乎對該過程更友善。我確定我可以做一些代碼來檢查/清理註冊表,但我認爲我們大多數人已經厭倦了現在似乎吃掉我們機器的註冊表混亂。

我知道有一些安全的權衡這一點,但沒有我對數據進行排序的是,這一事業的關鍵,我沒有任何痛苦的表現,由於應用程序的大小命中。

2

一種方法是創建一個設置類。使用XML序列化將其寫入文件系統。您可以通過創建一系列設置對象並對其進行序列化來擴展此概念。您可以在一個位置爲所有用戶提供所有設置,而無需擔心管理文件系統。

在任何人給我任何部分重新發明方向盤之前,讓我說幾件事情。首先,它只是幾行代碼來序列化和寫入文件。其次,如果你有一個包含您設置一個對象,你不必做,當你加載你的應用程序到的appSettings多次調用對象。最後,這是很容易的添加代表您的應用程序狀態的項目,從而使你恢復時,應用程序加載下一個長時間運行的任務。

4

或者將您的設置寫入xml文件並使用Isolated Storage進行保存。根據您使用的商店將其保存在Application Data文件夾中。您也可以選擇啓用漫遊的商店,這意味着當用戶登錄不同的計算機時,設置隨之移動。

0

隔離存儲主要用於使用ClickOnce分發的應用程序,並在安全沙箱中運行。基本路徑是爲您決定的,您將無法在您的代碼中推論出它。該路徑將是類似於 「\ LocalSettings \的ApplicationData \ IsolatedStorage \ ejwnwe.302 \ kfiwemqi.owx \ url.asdaiojwejoieajae ......」,不是所有的友好。您的存儲空間也很有限。

Ryan Farley has it right

7

.NET應用程序有一個內置的設置機制,很容易使用。它的問題,在我看來,就是它保存這些設置斷成默默無聞的目錄和最終用戶將無法找到它。而且,只是從調試切換到發佈構建會更改此目錄的位置,這意味着保存在一個配置中的任何設置都會丟失。

由於這些和其他原因,我想出了my own settings code for Windows Forms。它不像.NET中那樣光滑,但它更加靈活,並且我一直都在使用它。

1

我嘗試了一些方法來存儲我的設置,以簡單的文本文件,我發現最好的方式:存儲在應用程序文件夾

文件,使用情況,SETTINGS.TXT: (內設置文件批准的意見,嘗試//註釋)

//獲取設置數值

Settings.Get("name", "Ivan"); 

//設置設置數值

Settings.Set("name", "John"); 

使用:

using System; 
using System.Collections.Generic; 
using System.Runtime.InteropServices; 
using System.Text; 
using System.Windows.Forms; 

//你可以用部分名字還可以存儲,使用只需加名節套裝(SECTION_NAME,名稱,值)和獲取(SECTION_NAME,名稱,值)

public static class Settings 
{ 
    private static string SECTION = typeof(Settings).Namespace;//"SETTINGS"; 
    private static string settingsPath = Application.StartupPath.ToString() + "\\settings.txt"; 
    [DllImport("kernel32")] 
    private static extern long WritePrivateProfileString(string section, string key, string val, string filePath); 
    [DllImport("kernel32")] 
    private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath); 
    public static String GetString(String name) 
    { 
     StringBuilder temp = new StringBuilder(255); 
     int i = GetPrivateProfileString(SECTION,name,"",temp,255,settingsPath); 
     return temp.ToString(); 
    } 
    public static String Get(String name, String defVal) 
    { 
     return Get(SECTION,name,defVal); 
    } 
    public static String Get(string _SECTION, String name, String defVal) 
    { 
     StringBuilder temp = new StringBuilder(255); 
     int i = GetPrivateProfileString(_SECTION, name, "", temp, 255, settingsPath); 
     return temp.ToString(); 
    } 
    public static Boolean Get(String name, Boolean defVal) 
    { 
     return Get(SECTION, name, defVal); 
    } 
    public static Boolean Get(string _SECTION, String name, Boolean defVal) 
    { 
     StringBuilder temp = new StringBuilder(255); 
     int i = GetPrivateProfileString(_SECTION,name,"",temp,255,settingsPath); 
     bool retval=false; 
     if (bool.TryParse(temp.ToString(),out retval)) 
     { 
      return retval; 
     } else 
     { 
      return retval; 
     } 
    } 
    public static int Get(String name, int defVal) 
    { 
     return Get(SECTION, name, defVal); 
    } 
    public static int Get(string _SECTION, String name, int defVal) 
    { 
     StringBuilder temp = new StringBuilder(255); 
     int i = GetPrivateProfileString(SECTION,name,"",temp,255,settingsPath); 
     int retval=0; 
     if (int.TryParse(temp.ToString(),out retval)) 
     { 
      return retval; 
     } else 
     { 
      return retval; 
     } 
    } 
    public static void Set(String name, String val) 
    { 
     Set(SECTION, name,val); 
    } 
    public static void Set(string _SECTION, String name, String val) 
    { 
     WritePrivateProfileString(_SECTION, name, val, settingsPath); 
    } 
    public static void Set(String name, Boolean val) 
    { 
     Set(SECTION, name, val); 
    } 
    public static void Set(string _SECTION, String name, Boolean val) 
    { 
     WritePrivateProfileString(_SECTION, name, val.ToString(), settingsPath); 
    } 
    public static void Set(String name, int val) 
    { 
     Set(SECTION, name, val); 
    } 
    public static void Set(string _SECTION,String name, int val) 
    { 
     WritePrivateProfileString(SECTION, name, val.ToString(), settingsPath); 
    } 
} 
相關問題