2009-05-15 18 views
295

C# 2008 SP1C# ottenere il percorso del% AppData%

Sto usando il codice qui sotto:

dt.ReadXml("%AppData%\\DateLinks.xml"); 

Tuttavia, io sono sempre un'eccezione che indica la posizione in cui la mia applicazione è in esecuzione da:

Impossibile trovare una parte del percorso 'D: \ Projects \ SubVersionProjects \ CatDialer bin \ Debug \ \% AppData% \ DateLinks.xml'.

Ho pensato che il %AppData% dovrebbe trovare il percorso relativo. Quando vado Start|Run|%AppData%, Windows Explorer mi porta in quella directory.

Non riesco a inserire il percorso completo, poiché l'utente è diverso su ogni macchina client.

Molte grazie per qualsiasi consiglio,

risposta

635

Per ottenere risultati AppData directory , è meglio utilizzare il metodo GetFolderPath:

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) 

%AppData% è una variabile di ambiente, e non vengono espansi automaticamente ovunque in .NET, sebbene sia possibile utilizzare esplicitamente il metodo Environment.ExpandEnvironmentVariable per farlo. Suggerisco comunque vivamente di utilizzare GetFolderPath perché, come indicato da Johannes Rössel nel commento, %AppData% potrebbe non essere impostato in determinate circostanze.

Infine, per creare il percorso come indicato nel tuo esempio:

var fileName = Path.Combine(Environment.GetFolderPath(
    Environment.SpecialFolder.ApplicationData), "DateLinks.xml"); 
+36

+1 per offrire una soluzione reale, senza fare affidamento sull'ambiente. Per aggiungere alla risposta: non tutte le funzioni che gestiscono i nomi di file espande le variabili di ambiente. Di fatto, in genere devi farlo esplicitamente, altrimenti non funziona e ti ritroverai con%%% di cartelle. Inoltre, non è necessario che l'ambiente sia presente, in alcuni casi quando si esegue un programma con un altro account utente, l'ambiente dell'utente non verrà caricato e% Appdata% sarà vuoto. Ecco perché vorresti usare le API documentate per ottenere quelle cartelle (a meno che tu non stia usando i file batch, comunque). – Joey

+0

@Johannes: Buone informazioni lì. Ho appena modificato la mia risposta come postata, ma renderò più chiaro che GetFolderPath è decisamente preferibile su ExpandEnvironmentVariable. – Noldorin

+0

+1 per Environment.GetFolderPath (Environment.SpecialFolder.ApplicationData), ero dietro questo per un paio di giorni. –

6

non credo che mettere% AppData% in una stringa come che funzionerà.

provare

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData).ToString() 
19

È inoltre possibile utilizzare

Environment.ExpandEnvironmentVariables("%AppData%\\DateLinks.xml"); 

per espandere la variabile %AppData%.

43

Il percorso è diverso se si sta parlando di ASP.NET.

Non sono riuscito a trovare nessuno dei valori "SpecialFolder" che indicava/App_Data per ASP.NET.

Invece è necessario fare questo:

HttpContext.Current.ApplicationInstance.Server.MapPath("~/App_Data") 

(Nota: non è necessario il 'Current' immobile in un controller MVC)

Se c'è un altro modo più 'astratto' per ottenere per App_Data piacerebbe sapere come.

+0

Solo una nota dal nucleo asp.net è venuta fuori ora. Questo approccio si basa in particolare su IIS. –

+3

'HostingEnvironment.MapPath (@" ~/App_Data ")' è migliore e funziona in entrambi i contesti MVC/WebAPI e WCF in cui non è presente HttpContext, ma non è sicuro del core ' –

13

In .net2.0 è possibile utilizzare il Application.UserAppDataPath

+19

Questo è solo Winform. – Will

20

Il modo variabile BEST di utilizzare la directory AppData, IS utilizzare Environment.ExpandEnvironmentVariable metodo.

Motivi:

  • sostituisce parti della vostra stringa con directory valide o qualsiasi altra cosa
  • è case-insensitive
  • è facile e senza complicazioni
  • è uno standard
  • buona per trattare input dell'utente

Ex amples:

string path; 
path = "%AppData%\stuff"; 
path = "%aPpdAtA%\HelloWorld"; 
path = "%progRAMfiLES%\Adobe;%appdata%\FileZilla"; // collection of paths 

path = Environment.ExpandEnvironmentVariables(path); 
Console.WriteLine(path); 

Ricordate alcuni utenti digitano %AppData%, alcuni %appdata% e alcuni %APpData% Tu non vuoi finire con:

if (path.ToLower().StartsWith("%appdata%")) 
    ; // path manipulation 
if (path.ToLower().StartsWith("%programfiles%")) 
    ; // path manipulation 

Se la variabile d'ambiente non è impostata, non è il vostro guasto (inoltre quando è IS). Io di solito non dire alla gente di non ri-inventare la ruota, ma dopo ho iniziato ad andare nella direzione opposta e si rese conto che era una cattiva idea.

+0

Mi è piaciuto il tuo esempio di variabile 'path' :) – RBT

3

Volevo solo condividere un altro modo di accedere cartella 'App_Data' nella mia applicazione MVC nel caso in cui qualcuno ha bisogno di questo.

Path.Combine(HttpRuntime.AppDomainAppPath,"App_Data") 
+0

Potrebbe non essere la risposta giusta, ma è quello che stavo cercando. +1 – Derrick

+0

Ha funzionato per me dopo aver sostituito le virgolette singole con virgolette doppie. Path.Combine (HttpRuntime.AppDomainAppPath, "App_Data") – ajaysinghdav10d

+0

@ ajaysinghdav10d buon punto Ho aggiornato la mia risposta – cpoDesign

Problemi correlati