C # erhält den Pfad von% AppData%

387

C # 2008 SP1

Ich verwende den folgenden Code:

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

Es wird jedoch eine Ausnahme angezeigt, die auf den Speicherort verweist, von dem aus meine Anwendung ausgeführt wird:

Ein Teil des Pfads 'D: \ Projects \ SubVersionProjects \ CatDialer \ bin \ Debug \% AppData% \ DateLinks.xml' konnte nicht gefunden werden.

Ich dachte der %AppData%sollte den relativen Weg finden. Wenn ich gehe Start|Run|%AppData%, bringt mich der Windows Explorer in dieses Verzeichnis.

Ich kann nicht den vollständigen Pfad eingeben, da der Benutzer auf jedem Client-Computer unterschiedlich ist.

ant2009
quelle

Antworten:

802

Um das AppData- Verzeichnis abzurufen , verwenden Sie am besten die folgende GetFolderPathMethode:

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)

(muss hinzugefügt werden, using Systemwenn nicht vorhanden).

%AppData% ist eine Umgebungsvariable und wird an keiner Stelle in .NET automatisch erweitert, obwohl Sie die explizit verwenden können Environment.ExpandEnvironmentVariable Methode , um dies zu tun. Ich würde dennoch nachdrücklich empfehlen, dass Sie GetFolderPathjedoch verwenden, da, wie Johannes Rössel im Kommentar hervorhebt, %AppData%unter bestimmten Umständen möglicherweise nicht festgelegt wird.

So erstellen Sie den Pfad wie in Ihrem Beispiel gezeigt:

var fileName = Path.Combine(Environment.GetFolderPath(
    Environment.SpecialFolder.ApplicationData), "DateLinks.xml");
Noldorin
quelle
45
+1 für das Anbieten einer echten Lösung, ohne sich auf die Umgebung zu verlassen. So fügen Sie der Antwort hinzu: Nicht jede Funktion, die Dateinamen verarbeitet, erweitert Umgebungsvariablen. Normalerweise müssen Sie dies explizit tun, sonst funktioniert es nicht und Sie erhalten% etwas% Ordner. Darüber hinaus muss die Umgebung nicht vorhanden sein. In einigen Fällen wird beim Ausführen eines Programms unter einem anderen Benutzerkonto die Umgebung des Benutzers nicht geladen und% Appdata% ist leer. Aus diesem Grund möchten Sie die dokumentierten APIs zum Abrufen dieser Ordner verwenden (es sei denn, Sie verwenden Batch-Dateien).
Joey
@ Johannes: Gute Infos da. Ich habe meine Antwort gerade geändert, als Sie das gepostet haben, aber ich werde klarer machen, dass GetFolderPath ExpandEnvironmentVariable definitiv vorzuziehen ist.
Noldorin
+1 für Environment.GetFolderPath (Environment.SpecialFolder.ApplicationData), ich war jetzt einige Tage dahinter.
Sumit Ghosh
1
Aus irgendeinem Grund wird Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)für mich eine leere Zeichenfolge zurückgegeben (IIS 7, VS 2011). Problem gelöst mit Simon_Weaver Lösung - Mapping mit MapPath.
Mike Keskinov
52
Zu Ihrer Information, die das Roaming-Verzeichnis für lokale AppData Environment.GetFolderPath (Environment.SpecialFolder.LocalApplicationData)
angibt
49

Der Pfad ist anders, wenn Sie über ASP.NET sprechen.

Ich konnte keinen der 'SpecialFolder'-Werte finden, die auf / App_Data für ASP.NET verweisen.

Stattdessen müssen Sie Folgendes tun:

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

(Hinweis: In einem MVC-Controller benötigen Sie die Eigenschaft 'Current' nicht.)

Wenn es einen anderen "abstrakteren" Weg gibt, App_Datawürde ich gerne hören, wie.

Simon_Weaver
quelle
Nur eine Anmerkung, da der asp.net-Kern jetzt herauskommt. Dieser Ansatz basiert speziell auf IIS.
George Mauer
7
HostingEnvironment.MapPath(@"~/App_Data")ist besser und funktioniert sowohl in MVC / WebAPI- als auch in WCF-Kontexten, in denen es keinen HttpContext gibt - aber nicht sicher über den Kern '
Simon_Weaver
37

Die beste Möglichkeit, das AppData-Verzeichnis zu verwenden, ist IS verwendet Environment.ExpandEnvironmentVariableMethode.

Gründe dafür:

  • Es ersetzt Teile Ihrer Zeichenfolge durch gültige Verzeichnisse oder was auch immer
  • Es wird nicht zwischen Groß- und Kleinschreibung unterschieden
  • es ist einfach und unkompliziert
  • es ist ein Standard
  • gut für den Umgang mit Benutzereingaben

Beispiele:

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

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

Denken Sie daran, dass einige Benutzer Folgendes eingeben %AppData%, andere %appdata%und andere, mit denen %APpData% Sie nicht enden möchten:

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

Wenn die Umgebungsvariable nicht festgelegt ist, ist dies nicht Ihre Schuld (außer wenn dies der Fall ist ). Normalerweise sage ich den Leuten nicht , dass sie das Rad nicht neu erfinden sollen, aber nachdem ich das erste Mal in die andere Richtung gegangen bin und festgestellt habe, dass es eine schlechte Idee ist.

Bitter blau
quelle
Gefiel Ihre Beispiele für pathVariablen :)
RBT
+1 Environment.ExpandEnvironmentVariableist am besten, wenn Sie einfach erweitern müssen, unabhängig davon, welche env-Variablen sich in der Pfadzeichenfolge befinden.
Blins
24

Sie können auch verwenden

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

um die %AppData%Variable zu erweitern .

Geländer
quelle
15

In .net2.0 können Sie die Variable verwenden Application.UserAppDataPath

Nathan
quelle
20
Dies ist nur Winforms.
7

Ich denke nicht, dass es funktionieren wird,% AppData% in eine solche Zeichenfolge einzufügen.

Versuchen

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData).ToString()
danswain
quelle
4

Ich wollte nur eine andere Möglichkeit für den Zugriff auf den Ordner 'App_Data' in meiner MVC-Anwendung freigeben, falls jemand dies benötigt.

 Path.Combine(HttpRuntime.AppDomainAppPath,"App_Data")
cpoDesign
quelle
Könnte nicht die richtige Antwort sein, aber es ist das, wonach ich gesucht habe. +1
Derrick
Arbeitete für mich, nachdem ich einfache Anführungszeichen durch doppelte Anführungszeichen ersetzt hatte. Path.Combine (HttpRuntime.AppDomainAppPath, "App_Data")
ajaysinghdav10d
1

Dies funktioniert für mich in einer Konsolenanwendung -

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

Für ASP.NET muss die Load User ProfileEinstellung im App-Pool festgelegt werden, dies reicht jedoch nicht aus. Es gibt eine versteckte Einstellung mit dem Namen setProfileEnvironmentin\Windows\System32\inetsrv\Config\applicationHost.config , die aus irgendeinem Grund standardmäßig deaktiviert ist und nicht wie in der Dokumentation beschrieben aktiviert ist . Sie können die Standardeinstellung entweder ändern oder in Ihrem App-Pool festlegen. Alle Methoden in der EnvironmentKlasse geben dann die richtigen Werte zurück.

MoonStom
quelle