2013-08-06 61 views
5

在我的C#應用​​程序,我有一個自定義配置部分,以確定在哪裏存儲和檢索某些文件。然而這些默認位置是在C:\ ProgramData目錄,我們利用如何放置在配置文件在Windows特殊的文件夾

Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData); 

訪問它,我怎麼能預填充在我的配置文件目錄,而無需編寫出來的原始字符串?在某些情況下,它也可能是一個不同的特殊文件夾。

基本上它是看起來像一個配置元素:

<searchpath path="" priority="" isfullpath=""/> 

那些每然而在該目錄已經搬來搬去不同版本的過程中尋找配置型材產品的路徑,但爲了向後兼容,如果我無法在較新的路徑中找到它們,我仍然需要搜索較舊的路徑。

比如我在現在的產品要搜索的安裝目錄,則ProgramData目錄作爲我們的最新版本移動它到當前產品的安裝目錄,但我們的舊版本將其存儲在ProgramData目錄。

+0

所以你說你寧願拉從配置文件中的值,但它是可能的,它可以被覆蓋(即手動設置的)? –

+0

是否要存儲不同的'SpecialFolder's或者自定義路徑或'SpecialFolder'和用戶定義路徑的組合? – hangy

+0

正確。現在我只是讓他們在課堂上進行硬編碼,但我厭倦了每次都必須進入並更改代碼。 – twreid

回答

5

如何:

//string folderKey = ConfigurationManager.AppSettings["Folder"]; 
    string folderKey = "%CommonApplicationData%\\Test"; 
    var regex = new Regex("([%][^%]+[%])"); 
    string folder = regex.Replace(folderKey, (match) => { 
    // get rid of %% 
    string value = match.Value.Substring(1, match.Value.Length - 2); 
    var specialFolder = (Environment.SpecialFolder)Enum.Parse(typeof(Environment.SpecialFolder), value, true); 
    return Environment.GetFolderPath(specialFolder); 
    }); 

您可以使用%%指定特殊的文件夾路徑裏面,或者使用值作爲普通的路徑。

+0

感謝這爲我提供了最大的靈活性。 – twreid

+3

我會用這種方法,但不是用一個正則表達式和解析枚舉我只是調用[Enviorment.ExpandEnviornmentVariables(串)(http://msdn.microsoft.com/en-us/library/system.environment。expandenvironmentvariables.aspx)(你可以使用['%PROGRAMDATA%'](http://en.wikipedia.org/wiki/Environment_variable#Default_Values_on_Microsoft_Windows)來獲得'SpecialFolder.CommonApplicationData') –

+0

好!我喜歡。 @ScottChamberlain – twreid

1

好了,一個方法可能是在你的app.config添加<appSettings>部分:

<appSettings> 
    <add key="programData" value="" /> 
</appSettings> 

,然後在應用程序中,構建符合用於檢索路徑的靜態類:

public static class ProgramData 
{ 
    private static string _path; 
    public static string Path 
    { 
     get 
     { 
      if (!string.IsNullOrEmpty(_path)) { return _path; } 

      // let's set it then 
      _path = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData); 
      if (!string.IsNullOrEmpty(ConfigurationManager.AppSettings["programData"])) 
      { 
       _path = ConfigurationManager.AppSettings["programData"]; 
      } 
     } 
    } 
} 

現在當你想要的路徑,你所要做的就是:

var path = ProgramData.Path 

現在,如果有一個屬性它有一個值,它會使用它。否則它將默認爲SpecialFolder

還要說明一點,你需要添加一個引用System.Configuration

相關問題