Dieser Artikel ist ein Spiegelartikel der maschinellen Übersetzung, bitte klicken Sie hier, um zum Originalartikel zu springen.

Ansehen: 31124|Antwort: 2

[Konsolenprogramm] Seien Sie vorsichtig bei System.Environment.CurrentDirectory, um das aktuelle Verzeichnis zu erhalten

[Link kopieren]
Veröffentlicht am 10.11.2020 15:04:17 | | | |
In meiner jüngsten Arbeit möchte ich ein kleines Werkzeug für Kundenerinnerungen entwickeln; Natürlich muss das winform-Programm die Konfigurationsdatei desselben Verzeichnisses wie die Anwendung lesen (nicht die exe.config-Datei);

Um das Verzeichnis zu lesen, in dem sich die aktuelle Anwendung befindet, dachte ich sofort an System.Environment.CurrentDirectory, um das aktuelle Arbeitsverzeichnis zu erhalten. Das Programm scheint einwandfrei zu laufen;

Als ich am nächsten Morgen zur Arbeit kam, erschien es: "Lese-Konfigurationsdatei fehlt". Die App fügt Autostart-Boot-Start hinzu. Diese Meldung erscheint, um den Konfigurationsfehler zu lesen und sofort zu prüfen, ob die Konfigurationsdatei im Anwendungsverzeichnis von selbst gelöscht wurde. Nachdem ich nachgesehen hatte, stellte ich fest, dass die Datei noch da war, und ich beendete das Programm und führte es erneut aus

Immer noch in Ordnung, kein Pop-up-Profil fehlt. Dann prüfen Sie, ob der Pfad des Boot-Eintrags in der Registry nicht in meinem Verzeichnis ist? Wenn ich mir die Pfaddatei anschaue, ist alles in Ordnung. Ein bisschen verwirrt? Melde dich vom Computer ab und versuche neu zu starten, es taucht immer noch auf, die Konfigurationsdatei fehlt. Der Grund, warum wir den Weg nicht finden können, wird direkt angenommen

MessageBox läuft das Programm und stellt fest, dass der Pfad tatsächlich dieser Pfad ist.

Füge den MessageBox-Code hinzu und starte den Test weiter. Als ich startete, stellte ich fest, dass das aktuelle Verzeichnis, das erschien, C:\Windows\System32 war, und ich war sofort ratlos. Ich dachte mir, könnte es sein, dass Lao Tzus Programm bis system32 reicht? Ich habe die Registry überprüft und sysetm32 hat meine App nicht. Schließlich dachte ich, dass es ein Problem mit dem Code geben sollte, um den Pfad zu bekommen.

Nach wiederholten Tests stellte sich heraus, dass System.Environment.CurrentDirectory tatsächlich dazu dient, das aktuelle Verzeichnis zu erhalten, aber wenn Programm A Programm B aufruft, verwendet Programm B System.Environment.CurrentDirectory, um das Verzeichnis zu erhalten. Dann ist das im B-Programm erhaltene Verzeichnis nicht mehr das Verzeichnis, in dem sich die B-Anwendung befindet; Es wird zum Verzeichnis, in dem sich A befindet. Es ist nicht schwer zu finden, dass das Verzeichnis, das beim Booten erscheint, C:\Windows\System32 ist, da das Boot-Selbststartprogramm ebenfalls von einem Prozess in Windows aufgerufen wird.

Daher ist es am besten, System.Environment.CurrentDirectory zu verwenden, wenn das winform das Verzeichnis erhalten möchte, in dem sich die aktuelle Anwendung befindet. Stattdessen ist es: Application.StartupPath So ist es egal, wer es aufruft.

Testcode:




Übertragen von:Der Hyperlink-Login ist sichtbar.




Vorhergehend:K8S-Netzwerk-Flanell- und Calico-Vergleich
Nächster:C# legt Referenzbibliotheks-DLLs per Probing in Unterordner
 Vermieter| Veröffentlicht am 10.11.2020 15:08:26 |
C# ist eine Sammlung von Methoden, um den aktuellen laufenden Programmpfad zu erhalten

Erhalten Sie den vollständigen Pfad zum aktuellen Prozess, einschließlich des Dateinamens (Prozessname).
String str = das. GetType(). Versammlung. Standort;
result: X:\xxx\xxx\xxx.exe (.exe文件所在的目录+.exe文件名)

Der vollständige Pfad zum Hauptmodul, der die neue Prozesskomponente erhält und sie mit dem aktuell aktiven Prozess verknüpft, einschließlich des Dateinamens (Prozessname).
string str = System.Diagnostics.Process.GetCurrentProcess(). MainModule.Dateiname;
result: X:\xxx\xxx\xxx.exe (.exe文件所在的目录+.exe文件名)

//获取和设置当前目录(即该进程从中启动的目录)的完全限定路径。
string str = System.Environment.CurrentDirectory;
result: X:\xxx\xxx (.exe文件所在的目录)

Erhält das Basisverzeichnis der aktuellen Anwendungsdomäne des aktuellen Threads, das vom Assembler-Konfliktlöser verwendet wird, um die Assembly zu testen.
string str = System.AppDomain.CurrentDomain.BaseDirectory;
result: X:\xxx\xxx\ (.exe文件所在的目录+"\")

Holen Sie sich und setzen Sie den Namen des Verzeichnisses, das die Anwendung enthält. (Empfohlen)
string str = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
result: X:\xxx\xxx\ (.exe文件所在的目录+"\")

Erhalten Sie den Pfad zur ausführbaren Datei, die die Anwendung gestartet hat, ohne den Namen der ausführbaren Datei.
string str = System.Windows.Forms.Application.StartupPath;
result: X:\xxx\xxx (.exe文件所在的目录)

//获取启动了应用程序的可执行文件的路径,包括可执行文件的名称。
string str = System.Windows.Forms.Application.ExecutablePath;
result: X:\xxx\xxx\xxx.exe (.exe文件所在的目录+.exe文件名)

Holen Sie sich das aktuelle Arbeitsverzeichnis der Anwendung (unzuverlässig).
string str = System.IO.Directory.GetCurrentDirectory();
result: X:\xxx\xxx (.exe文件所在的目录)
Veröffentlicht am 22.09.2021 20:38:52 |
Lerne zu lernen...
Verzichtserklärung:
Alle von Code Farmer Network veröffentlichten Software, Programmiermaterialien oder Artikel dienen ausschließlich Lern- und Forschungszwecken; Die oben genannten Inhalte dürfen nicht für kommerzielle oder illegale Zwecke verwendet werden, andernfalls tragen die Nutzer alle Konsequenzen. Die Informationen auf dieser Seite stammen aus dem Internet, und Urheberrechtsstreitigkeiten haben nichts mit dieser Seite zu tun. Sie müssen die oben genannten Inhalte innerhalb von 24 Stunden nach dem Download vollständig von Ihrem Computer löschen. Wenn Ihnen das Programm gefällt, unterstützen Sie bitte echte Software, kaufen Sie die Registrierung und erhalten Sie bessere echte Dienstleistungen. Falls es eine Verletzung gibt, kontaktieren Sie uns bitte per E-Mail.

Mail To:help@itsvse.com