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.
|