9 Stimmen

Wie funktioniert die standardmäßige/relative Pfadauflösung in .NET?

Also... Ich dachte immer, wenn man auf eine Datei zugreift, aber den Namen ohne Pfad angibt (in meinem Fall CAISLog.csv), würde .NET erwarten, dass sich die Datei im selben Pfad wie die laufende .exe befindet.

Dies funktioniert, wenn ich durch eine Lösung (C# .NET2.* VS2K5), aber wenn ich die app im normalen Modus (gestartet von einem Websphere MQ-Trigger-Monitor & läuft im Hintergrund als Netzwerkdienst) anstelle des Zugriffs auf die Datei auf den Pfad, wo die .exe ist es wird gesucht, bei C:\WINDOWS\system32. Wenn es darauf ankommt Die übergeordnete Aufgabe .exe ist in fast der gleichen Ordnerstruktur / Pfad wie meine app

Ich erhalte einen entsprechenden Fehler: " System.UnauthorizedAccessException: Der Zugriff auf den Pfad ' C:\WINDOWS\system32\CAISLog.csv ' wird verneint. "

Meine Abhilfe besteht darin, den Speicherort meiner Datei vollständig zu qualifizieren. Was ich jedoch verstehen möchte, ist "Wie lautet die .NET-Regel, die regelt, wie ein Pfad aufgelöst wird, wenn während der IO nur der Dateiname angegeben wird?" Ich habe das Gefühl, dass mir ein grundlegendes Konzept fehlt, und das ärgert mich sehr.

edit - Ich bin mir nicht sicher, ob es eine.NET-Regel per se ist, aber Schmuli scheint das Konzept ein wenig klarer zu erklären. Ich werde auf jeden Fall versuchen, Rob Prouse's Vorschläge in der Zukunft so +1 auf, dass auch.

Wenn jemand Vorschläge zur Umformulierung hat, die betonen, dass ich nicht realmente Ich habe mich nicht darum gekümmert, den Pfad zu meiner .exe zu finden - ich habe einfach nicht verstanden, was mit der relativen Pfadauflösung los ist (und vielleicht habe ich immer noch meine Terminologie durcheinander gebracht)...

12voto

Schmuli Punkte 733

Wenn eine Anwendung (WinForms) gestartet wird, wird die Environment.CurrentDirectory enthält den Pfad zum Anwendungsordner (d. h. den Ordner, der die .exe-Assembly enthält). Mit einem der Dateidialoge, z. B. OpenFileDialog , SaveFileDialog usw. führt zu einem Wechsel des aktuellen Verzeichnisses (wenn ein anderer Ordner ausgewählt wurde).

Wenn ein Windows-Dienst ausgeführt wird, ist der ihn enthaltende Ordner C:\Windows\System32 da dies der Systemordner ist und es das System (d.h. das Betriebssystem) ist, auf dem Ihr Windows-Dienst tatsächlich läuft.

Beachten Sie, dass die Angabe eines relativen Pfades in den meisten der System.IO Objekte, wird auf die Verwendung der Environment.CurrentDirectory Eigentum.

Wie bereits erwähnt, gibt es mehrere Möglichkeiten, den Pfad der ausführbaren Datei des Dienstes zu ermitteln, und zwar mit Assembly.GetEntryAssembly() ou Assembly.GetExecutingAssembly() und dann entweder mit der Location Eigenschaft oder die CodeBase (beachten Sie, dass dies der Dateipfad und nicht das Verzeichnis der ausführbaren Datei ist).

Eine andere Möglichkeit ist die Verwendung:

`System.IO.Directory.SetCurrentDirectory( System.AppDomain.CurrentDomain.BaseDirectory );`

Tätigen Sie den Anruf im Service OnStart Methode und wendet sie auf die gesamte Anwendung an.

9voto

Rob Prouse Punkte 21205

Sie basiert auf dem aktuellen Arbeitsverzeichnis, das mit dem Verzeichnis Ihrer Anwendung übereinstimmen kann oder auch nicht, vor allem, wenn diese von einem anderen Programm oder einer Verknüpfung mit einem anderen Arbeitsverzeichnis gestartet wird.

Anstatt den Pfad hart zu kodieren, sollten Sie den Pfad zu Ihrem Programm ermitteln und ihn verwenden. Sie können dies mit etwas wie diesem tun

Assembly ass = Assembly.GetEntryAssembly();
string dir = Path.GetDirectoryName(ass.Location);
string filename = Path.Combine( dir, "CAISLog.csv" );

Dabei wird davon ausgegangen, dass sich Ihre Datei in der Eingangsgruppe befindet. Wenn nicht, können Sie ändern, um die Baugruppe für etwas wie;

Assembly ass = Assembly.GetAssembly( typeof( AClassInYourAssembly ) );

2 Stimmen

Wenn ich mich richtig erinnere, gibt Assembly.Location den vollständigen Pfad zur Baugruppe zurück, d. h. einschließlich des Dateinamens. Sie müssten also Path.GetDirectoryName(ass.Location) aufrufen, um das Verzeichnis tatsächlich zu erhalten. Abgesehen davon, +1 für die Antwort.

4voto

tomasr Punkte 13533

Relative Pfadauflösung niemals arbeitet mit dem Pfad der startenden ausführbaren Datei. Es arbeitet immer mit dem aktuellen Verzeichnis des Prozesses, und Sie können nicht wirklich erwarten, dass dieses immer auf das Verzeichnis gesetzt ist, in dem sich die .exe befindet.

Wenn Sie dieses Verhalten benötigen, müssen Sie den richtigen Pfad selbst herausfinden und einen vollständig qualifizierten Pfad zu den Dateioperationen angeben.

-2voto

RWendi Punkte 1416

Sie können dies verwenden, um einen Pfad anzugeben, der auf demselben Pfad wie Ihre Exe @". liegt. \CAISLog.csv ". Bitte beachten Sie, dass sich die Doppelpunkte auf das übergeordnete Verzeichnis beziehen, in dem sich Ihre .exe-Datei befindet.

RWendi

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X