2013-08-06 6 views
5

In meiner C# -Anwendung habe ich einen benutzerdefinierten Konfigurationsabschnitt, um zu bestimmen, wo bestimmte Dateien gespeichert und abgerufen werden sollen. Jedoch ist die Standardposition für diese ist in dem Verzeichnis c: \ Programdata-Verzeichnis und wir darauf zugreifen, indemSo legen Sie einen speziellen Windows-Ordner in der Konfigurationsdatei ab

Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData); 

Wie kann ich das Verzeichnis in meiner config-Datei vorab auszufüllen, ohne den rohen String zu schreiben zu haben? Es könnte in einigen Fällen auch ein anderer spezieller Ordner sein.

Im Grunde ist es ein Konfigurationselement, das wie folgt aussieht:

für Konfigurationsprofile für ein Produkt jedoch im Laufe der verschiedenen Versionen, das Verzeichnis verschoben wurde um
<searchpath path="" priority="" isfullpath=""/> 

Jedem von ihnen ist ein Weg zu suchen, aber aus Gründen der Abwärtskompatibilität muss ich immer noch die älteren Pfade durchsuchen, wenn ich sie nicht in den neueren Pfaden finden kann.

Zum Beispiel muss ich im Produktinstallationsverzeichnis dann das ProgramData-Verzeichnis suchen, da unsere neueste Version es in das aktuelle Produktinstallationsverzeichnis verschoben hat, aber unsere ältere Version speicherte es im ProgramData-Verzeichnis.

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

und dann in der Anwendung, eine statische Klasse bauen, die den Weg zum Abrufen verwendet wird:

+0

Sie sagen also, Sie ziehen lieber den Wert aus der Konfigurationsdatei, aber es ist möglich, dass es überschrieben werden kann (d. H. Von Hand gesetzt)? –

+0

Möchten Sie verschiedene 'SpecialFolder's oder auch benutzerdefinierte Pfade oder Kombinationen aus' SpecialFolder' und einem benutzerdefinierten Pfad speichern? – hangy

+0

Korrigieren. Im Moment habe ich sie nur in der Klasse fest programmiert, aber ich bin es leid, jedes Mal einen Code ändern zu müssen. – twreid

Antwort

5

Wie sei:

//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); 
    }); 

Sie %% verwenden können spezielle Ordner in Ihrem Pfad angeben oder den Wert als gewöhnlicher Pfad verwenden.

+0

Dank dieser bot mir die größte Flexibilität. – twreid

+3

Ich würde diese Methode verwenden, aber anstatt eine Regex zu verwenden und die Enumeration zu analysieren, würde ich einfach [Enviorment.ExpandEnviornmentVariables (string)] (http://msdn.microsoft.com/en-us/library/system.environment.expandenvironmentvariables.aspx) (Sie würden [% PROGRAMDATA% '] (http://en.wikipedia.org/wiki/Environment_variable#Default_Values_on_Microsoft_Windows) verwenden, um' SpecialFolder.CommonApplicationData' zu erhalten) –

+0

Schön! Ich mag es. @ ScottChamberlain – twreid

1

Okay, so ein Ansatz könnte einen <appSettings> Abschnitt in Ihrem app.config hinzuzufügen seine

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"]; 
      } 
     } 
    } 
} 

Nun, wenn Sie den Pfad wollen, alles, was Sie tun, ist:

var path = ProgramData.Path 

Nun, wenn dort ein Attribut und ist, hat es einen Wert, den es verwenden wird. Andernfalls wird standardmäßig SpecialFolder angezeigt.

Noch eine Anmerkung, Sie müssen einen Verweis auf System.Configuration hinzufügen.

Verwandte Themen