2013-08-06 7 views
5

Nella mia applicazione C# ho una sezione di configurazione personalizzata per determinare dove archiviare e recuperare determinati file. Tuttavia la posizione di default per questi è nella directory c: \ ProgramData e accedervi utilizzandoCome posizionare una cartella speciale di Windows nel file di configurazione

Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData); 

Come posso precompilare directory nel mio file di configurazione senza dover scrivere la stringa crudo? Potrebbe anche essere una cartella speciale diversa in alcuni casi.

Fondamentalmente si tratta di un elemento di configurazione che assomiglia:

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

Ognuno di questi è un percorso per la ricerca di profili di configurazione per un prodotto comunque nel corso di diverse versioni che directory è stato spostato intorno, ma per compatibilità con le versioni precedenti ho ancora bisogno di cercare i percorsi più vecchi se non riesco a trovarli nei percorsi più recenti.

Ad esempio, devo cercare nella directory di installazione del prodotto, quindi la directory ProgramData ora come la nostra versione più recente lo ha spostato nella directory di installazione dei prodotti corrente, ma la nostra versione precedente lo stava archiviando nella directory ProgramData.

+0

Quindi stai dicendo che preferiresti estrarre il valore dal file di configurazione, ma è possibile che sia sovrascritto (cioè impostato a mano)? –

+0

Vuoi memorizzare diversi 'SpecialFolder's o anche percorsi personalizzati o combinazioni di' SpecialFolder' e un percorso definito dall'utente? – hangy

+0

corretto. In questo momento li ho appena codificati nella classe, ma sono stanco di dover entrare e fare un cambio di codice ogni volta. – twreid

risposta

5

ne dite:

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

È possibile utilizzare %% per specificare speciale cartella all'interno del vostro percorso, o utilizzare il valore come percorso ordinario.

+0

Grazie a questo mi ha offerto la massima flessibilità. – twreid

+3

Vorrei usare questo metodo, ma invece di usare un'espressione regolare e analizzare l'enumerazione, chiamerei semplicemente [Enviorment.ExpandEnviornmentVariables (string)] (http://msdn.microsoft.com/en-us/library/system.environment.expandenvironmentvariables.aspx) (dovresti usare ['% PROGRAMDATA%'] (http://en.wikipedia.org/wiki/Environment_variable#Default_Values_on_Microsoft_Windows) per ottenere 'SpecialFolder.CommonApplicationData') –

+0

Bello! Mi piace. @ScottChamberlain – twreid

1

Okay, uno approccio potrebbe essere quella di aggiungere una sezione <appSettings> nel vostro app.config:

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

e poi nell'applicazione, costruire una classe statica che viene utilizzato per recuperare il percorso:

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

Ora quando vuoi il percorso, tutto ciò che fai è:

var path = ProgramData.Path 

Ora, se è presente un attributo e, ha un valore, lo utilizzerà. Altrimenti verrà impostato automaticamente su SpecialFolder.

Un'altra nota, è necessario aggiungere un riferimento a System.Configuration.

Problemi correlati