2013-08-06 12 views
5

W mojej aplikacji C# mam niestandardową sekcję konfiguracji, aby określić, gdzie przechowywać i pobierać określone pliki. Jednak domyślna lokalizacja dla nich jest w katalogu C: \ ProgramData i mamy do niego dostęp za pomocąJak umieścić specjalny folder Windows w pliku konfiguracyjnym

Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData); 

Jak mogę wstępnie wypełnić ten katalog w moim pliku konfiguracyjnego bez konieczności pisania z surowego ciąg? Może to być również inny folder specjalny w niektórych przypadkach.

Zasadniczo jest to element konfiguracji, która wygląda następująco:

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

Każdy z nich jest droga, aby szukać profile konfiguracyjne dla produktu jednak w ciągu różnych wersjach, że katalog został przeniesiony wokół, ale dla zgodności wstecznej nadal muszę przeszukiwać starsze ścieżki, jeśli nie mogę znaleźć ich w nowszych ścieżkach.

Na przykład muszę wyszukać w katalogu instalacji produktu, a następnie w katalogu ProgramData, ponieważ nasza najnowsza wersja przeniosła go do bieżącego katalogu instalacyjnego produktów, ale nasza starsza wersja zapisywała go w katalogu ProgramData.

+0

Mówisz, że wolisz pobrać wartość z pliku konfiguracyjnego, ale możliwe, że została ona przesłonięta (tj. Ustawiona ręcznie)? –

+0

Czy chcesz zapisać różne ścieżki 'SpecialFolder' lub niestandardowe lub kombinacje' SpecialFolder' i ścieżkę zdefiniowaną przez użytkownika? – hangy

+0

Prawidłowo. W tej chwili po prostu mam je zakodowane w klasie, ale jestem zmęczony koniecznością wejścia i zmiany kodu za każdym razem. – twreid

Odpowiedz

5

Jak o:

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

%% można użyć do określenia specjalnego folderu wewnątrz swojej drodze lub użyj wartość jako zwykłą ścieżką.

+0

Dzięki temu zapewniałem największą elastyczność. – twreid

+3

Użyłbym tej metody, ale zamiast używać wyrażeń regularnych i parsowania wyliczenia, po prostu zadzwoniłbym [Enviorment.ExpandEnviornmentVariables (string)] (http://msdn.microsoft.com/en-us/library/system.environment.expandenvironmentvariables.aspx) (możesz użyć ['% PROGRAMDATA%'] (http://en.wikipedia.org/wiki/Environment_variable#Default_Values_on_Microsoft_Windows), aby uzyskać 'SpecialFolder.CommonApplicationData') –

+0

Nice! Lubię to. @ScottChamberlain – twreid

1

Ok, więc jedno podejście może być, aby dodać sekcję <appSettings> w app.config:

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

a następnie we wniosku, zbudować statycznych klasy, który jest używany do pobierania ścieżkę:

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

Teraz, gdy chcesz ścieżki, wszystko, co musisz zrobić, to:

var path = ProgramData.Path 

Teraz, jeśli istnieje atrybut i ma on wartość, użyje tego. W przeciwnym razie domyślnie będzie to SpecialFolder.

Jeszcze jedna uwaga, musisz dodać odniesienie do System.Configuration.

Powiązane problemy