Also ... Ich dachte früher, dass, wenn Sie auf eine Datei zugreifen, aber den Namen ohne einen Pfad angeben (CAISLog.csv in meinem Fall), dass .NET erwarten würde, dass sich die Datei im selben Pfad wie die ausführbare .exe befindet .
Das funktioniert, wenn ich eine Lösung durchtrete (C # .NET2. * VS2K5), aber wenn ich die App im normalen Modus (Gestartet von einem Websphere MQ Trigger Monitor und im Hintergrund als Netzwerkdienst ausgeführt) starte des Zugriffs auf die Datei unter dem Pfad, in dem die .exe gesucht wird, unter C: \ WINDOWS \ system32. Wenn es wichtig ist. Die EXE-Datei der Elternaufgabe befindet sich in fast der gleichen Ordnerstruktur / Pfad wie meine App
Ich bekomme einen passenden Fehler: " System.UnauthorizedAccessException: Zugriff auf den Pfad 'C: \ WINDOWS \ system32 \ CAISLog.csv' wird verweigert. "
Meine Problemumgehung besteht darin, den Speicherort meiner Datei vollständig zu qualifizieren. Was ich jedoch verstehen möchte, ist "Was ist die .NET-Regel, die regelt, wie ein Pfad aufgelöst wird, wenn nur der Dateiname während IO angegeben wird?" Ich habe das Gefühl, dass ich ein grundlegendes Konzept vermisse Es nervt mich schlecht.
bearbeiten - Ich bin mir nicht sicher, ob es eine .NET-Regel per se ist, aber Schmuli scheint das Konzept etwas klarer zu erklären. Ich werde Rob Prouses Vorschläge in Zukunft unbedingt auch +1 dazu machen.
Wenn jemand einige Vorschläge zur Umbenennung hat, die betonen, dass ich mich nicht wirklich darum kümmere, den Pfad zu meiner .exe zu finden, habe ich einfach nicht verstanden, was mit der relativen Pfadauflösung vor sich ging ( und ich habe vielleicht noch meine terminlogy vermasselt) ...
Wenn eine Anwendung (WinForms) gestartet wird, enthält Environment.CurrentDirectory
den Pfad zum Anwendungsordner (d. h. dem Ordner, der die .exe-Assembly enthält). Verwenden eines der Dateidialoge, z. OpenFileDialog
, SaveFileDialog
usw. bewirkt, dass das aktuelle Verzeichnis geändert wird (wenn ein anderer Ordner ausgewählt wurde).
Wenn ein Windows-Dienst ausgeführt wird, ist sein Ordner C: \ Windows \ System32, da dies der Systemordner ist und das System (d. h. das Betriebssystem) Ihren Windows-Dienst ausführt.
Beachten Sie, dass die Angabe eines relativen Pfads in den meisten Objekten System.IO
auf die Eigenschaft Environment.CurrentDirectory
zurückgreift.
Wie bereits erwähnt, gibt es mehrere Möglichkeiten, den Pfad der ausführbaren Datei des Dienstes zu erhalten, indem Sie Assembly.GetEntryAssembly()
oder Assembly.GetExecutingAssembly()
verwenden und dann entweder die Eigenschaft Location
oder die Eigenschaft CodeBase
verwenden (beachten Sie, dass dies die Datei ist) Pfad, nicht Verzeichnis der ausführbaren Datei).
Eine andere Möglichkeit ist:
%Vor% Machen Sie den Aufruf in der Methode OnStart
des Service und wenden Sie ihn auf die gesamte Anwendung an.
Es basiert auf dem aktuellen Arbeitsverzeichnis, das mit dem Verzeichnis Ihrer Anwendung identisch sein kann oder auch nicht, besonders wenn es von einem anderen Programm oder einer Verknüpfung mit einem anderen Arbeitsverzeichnis gestartet wurde.
Anstatt den Pfad hart zu codieren, rufen Sie den Pfad zu Ihrem Programm auf und verwenden Sie ihn. Sie können dies mit so etwas tun
%Vor%Dies setzt voraus, dass sich die Eingabeassembly in Ihrer Datei befindet. Wenn nicht, können Sie die Assembly für etwas wie "
" ändern %Vor%Relative Pfadauflösung nie wirkt gegen den Pfad der ausführbaren Startdatei. Es funktioniert immer gegen das aktuelle Verzeichnis des Prozesses, und Sie können nicht wirklich erwarten, dass immer auf das Verzeichnis festgelegt wird, in dem die EXE-Datei gespeichert ist.
Wenn Sie dieses Verhalten benötigen, dann achten Sie darauf, den richtigen Pfad selbst herauszufinden und einen vollständig qualifizierten Pfad für die Dateioperationen anzugeben.
Tags und Links c# visual-studio file-io .net-2.0