C # ottiene il percorso di% AppData%


387

C # 2008 SP1

Sto usando il codice qui sotto:

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

Tuttavia, sto ricevendo un'eccezione che indica la posizione da cui viene eseguita la mia applicazione:

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

Ho pensato che %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.

Risposte:


802

Per ottenere la directory AppData , è meglio utilizzare il GetFolderPathmetodo:

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)

(deve aggiungere using Systemse non presente).

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

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

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

45
+1 per offrire una soluzione reale, non basandosi sull'ambiente. Per aggiungere alla risposta: non tutte le funzioni che gestiscono i nomi dei file espandono le variabili di ambiente. In effetti, di solito devi farlo esplicitamente, altrimenti non funziona e finirai con% qualcosa% cartelle. Inoltre, l'ambiente non deve essere 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 file batch, però).
Joey,

@Johannes: buone informazioni lì. Ho appena modificato la mia risposta quando l'hai pubblicata, ma renderò più chiaro che GetFolderPath è sicuramente preferibile a ExpandEnvironmentVariable.
Noldorin,

+1 per Environment.GetFolderPath (Environment.SpecialFolder.ApplicationData), sono stato dietro questo per un paio di giorni ormai.
Sumit Ghosh,

1
Per qualche motivo Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)restituisce una stringa vuota per me (IIS 7, VS 2011). Problema risolto utilizzando la soluzione Simon_Weaver - mapping utilizzando MapPath.
Mike Keskinov,

52
Cordiali saluti che fornisce la directory di roaming per AppData Environment.GetFolderPath locale (Environment.SpecialFolder.LocalApplicationData)
roundcrisis

49

Il percorso è diverso se stai parlando ASP.NET.

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

Invece devi fare questo:

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

(Nota: non è necessaria la proprietà 'Current' in un controller MVC)

Se c'è un altro modo più "astratto" per arrivare, mi App_Datapiacerebbe sapere come.


Solo una nota poiché il core asp.net sta uscendo ora. Questo approccio si basa specificamente su IIS.
George Mauer,

7
HostingEnvironment.MapPath(@"~/App_Data")è migliore e funziona in entrambi i contesti MVC / WebAPI e WCF in cui non esiste HttpContext - ma non sono sicuro del core '
Simon_Weaver

37

Il modo MIGLIORE per usare la directory AppData è IS per usare il Environment.ExpandEnvironmentVariablemetodo.

Motivi:

  • sostituisce parti della stringa con directory valide o altro
  • non fa distinzione tra maiuscole e minuscole
  • è facile e semplice
  • è uno standard
  • buono per gestire l'input dell'utente

Esempi:

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

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

Ricorda che alcuni utenti digitano %AppData%, alcuni %appdata%e alcuni %APpData% Non vuoi finire con:

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

Se la variabile di ambiente non è impostata, non è colpa tua (oltre a quando è IS ). Di solito non dico alle persone di non reinventare la ruota, ma dopo che sono andato dall'altra parte e ho capito che era una cattiva idea.


Mi è piaciuto il tuo esempio di pathvariabile :)
RBT

+1 Environment.ExpandEnvironmentVariableè il migliore quando devi semplicemente espanderlo indipendentemente da quali variabili potrebbero essere presenti nella stringa del percorso.
Blins

24

Puoi anche usare

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

per espandere la %AppData%variabile.


15

In .net2.0 è possibile utilizzare la variabile Application.UserAppDataPath


20
Questo è solo Winforms.

7

Non credo che mettere% AppData% in una stringa del genere funzionerà.

provare

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

4

Volevo solo condividere un altro modo di accedere alla cartella 'App_Data' nella mia applicazione mvc nel caso qualcuno ne avesse bisogno.

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

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

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

1

Questo funziona per me in un'applicazione console -

string appData = System.Environment.GetEnvironmentVariable("APPDATA");

1

Per ASP.NET, l' Load User Profileimpostazione deve essere configurata nel pool di app, ma non è sufficiente. Esiste un'impostazione nascosta denominata setProfileEnvironmentin \Windows\System32\inetsrv\Config\applicationHost.config, che per qualche motivo è disattivata per impostazione predefinita, anziché attivata come descritto nella documentazione . Puoi modificare il valore predefinito o impostarlo sul pool di app. Tutti i metodi sulla Environmentclasse restituiranno quindi i valori corretti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.