Entwickler-Ecke

Dateizugriff - Aktueller Pfad zur exe


OsCor - Do 24.03.11 12:03
Titel: Aktueller Pfad zur exe
Hallo Foristen,

eine Anwendung ist einerseits im täglichen Betrieb (Zugriff über einen Netzwerkpfad), wird aber auch laufend weiterentwickelt. Wenn eine neue lauffähige exe bereitsteht, wird diese in ein Verzeichnis kopiert, das dann mittels Umbenennung zum Programmverzeichnis wird. (Kopieren --> Alt, Umbenennen Alt --> Neu, Umbenennen Ziel --> Alt, Umbenennen Neu --> Ziel)
Das führt dazu, dass die gerade aktiven User, die bisher mit der exe im Verzeichnis Ziel arbeiten, jetzt den Programmpfad zum Verzeichnis Alt nutzen - jedenfalls so lange bis das Programm neu gestartet wird.
Jetzt meine Frage: Wie kann ich aus dem Programm (D2007) heraus feststellen, wie das Verzeichnis heißt, in dem die momentan genutzte exe liegt?

Ich hoffe, das ist verständlich ausgedrückt.

Oswald


Gausi - Do 24.03.11 12:24


Delphi-Quelltext
1:
ExtractFileDir(ParamStr(0));                    


OsCor - Do 24.03.11 14:38

Hallo, Gausi!

Ich bin einfach nicht darauf gekommen, dass in den Dateifunktionen die Lösung liegen könnte. Beim Nachschauen, wie ExtractFileDir verwendet wird, bin ich auf die Funktion GetCurrentDir gestoßen. Das funktioniert allerdings auch nur, wenn die exe im Arbeitsverzeichnis liegt. Dieses wird nämlich von GetCurrentDir angezeigt, wenn man bei den Eigenschaften einer Verknüpfung im Feld „Ausführen in” ein spezielles Arbeitsverzeichnis eingibt.

Gerne wüßte ich den Unterschied von GetCurrentDir und GetDir. Letzteres ermittelt laut Delphi-Hilfe das aktuelle Arbeitsverzeichnis.

Vielen Dank
Oswald


Gausi - Do 24.03.11 15:02

zur Erklärung: In ParamStr(0) steht der komplette Pfad des Programmes drin, das gerade ausgeführt ist. ExtractFileDir bzw. ExtractFilePath schneidet aus diesem String das "meinProg.exe" ab. Die eine Funktion mit, die andere ohne das letzte "\". Mit CurrentDir hat das nichts zu tun. ;-)


OsCor - Do 24.03.11 17:31

Knackpunkt war das Argument für die Funktion. Die Hilfe sagt da leider nichts dazu.

Alles klar. Vielen Dank!

Oswald


FrEaKY - Do 24.03.11 18:55

Darf ich direkt mal eine Frage einwerfen - ich muss jedes mal überlegen, ob ich nun den "\" reinmachen muss oder nicht.
Ist da laut Definition ein Unterschied zwischen Dir und Path, oder nur bei diesen beiden Funktionen willkürlich?


jaenicke - Do 24.03.11 22:28

In Delphi sollte das immer so sein, mit fällt jedenfalls gerade keine Ausnahme ein.

Du kannst aber auch einfach IncludeTrailingPathDelimiter verwenden.


OsCor - Fr 25.03.11 10:38

Sorry, muss die Frage wieder als offen kennzeichnen, weil mein Problem doch noch nicht gelöst ist:

Wenn man ein Programm startet und ExtractFileDir aufruft, erhält man den Pfad, aus dem das Programm aufgerufen wurde. So weit, so gut.
Wenn man dann diesen Pfad umbenennt (während das Programm läuft) und ExtractFileDir timergesteuert nach dem Pfad suchen läßt, wird der ursprüngliche Pfad ausgegeben und nicht der neue. In welchem Pfad das Programm augenblicklich tatsächlich hängt, zeigt mir das Tool „WhoHasIt” - und das findet die exe eben unter dem neuen Pfad.

Geht das so also gar nicht oder hat jemand noch eine Idee?

Oswald


jaenicke - Fr 25.03.11 11:12

Ich kann das nicht testen, da bei mir (wie eigentlich auch normal) ein Umbenennen des Verzeichnisses während die Exe läuft nicht möglich ist. Aber du könntest OpenProcess + NtQueryInfomationFile + NtQueryObject versuchen. :nixweiss:

Ob das klappt kannst du auch vorher im Process Monitor prüfen. Wenn dort das Handle zur Exe mit dem neuen Pfad gefunden wird, klappt das so.


OsCor - Fr 25.03.11 11:19

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Ich kann das nicht testen, da bei mir (wie eigentlich auch normal) ein Umbenennen des Verzeichnisses während die Exe läuft nicht möglich ist.

Es handelt sich um LW-Pfade in einem Novell-Netzwerk. Lokal habe ich das noch nie probiert.

Oswald


jasocul - Fr 25.03.11 11:19

Das Umbenennen funktioniert unter gewissen Umständen.
Ich benenne auch schonmal Dateien im Netzwerk um, obwohl sie in Benutzung sind. Überschreiben geht allerdings nicht. Ist eine Frage des Betriebssystems.
Aber es sollte eigentlich logisch sein, dass die "alten" Angaben bestehen bleiben, bis die Bindung aufgehoben ist. Zum Beispiel durch Beenden des Programms. Dadurch kann bis dahin natürlich erstmal nur der alte Zustand über die Pfade und Dateinamen zurückgeliefert werden.


OsCor - Fr 25.03.11 11:43

user profile iconjasocul hat folgendes geschrieben Zum zitierten Posting springen:
Aber es sollte eigentlich logisch sein, dass die "alten" Angaben bestehen bleiben, bis die Bindung aufgehoben ist.

Der Grund, warum ich diese Vorgehensweise wählen wollte, war eben das vorher zitierte Tool „WhoHasIt”, das bei Angabe des Pfades und der gesuchten Datei angibt, wer denn gerade mit dem Programm arbeitet (IP-Adresse und Username). Diese Informationen gibt das Tool aber nur aus, wenn der Pfad stimmt:
Wenn ich einen Pfad umbenenne, von dem aus drei Personen das Programm gestartet haben, finde ich die Informationen darüber, wer mein Programm gestartet hat, nur wenn ich den neuen Pfadnamen angebe.
Also einen Weg scheint es grundsätzlich zu geben.

Oswald


jasocul - Fr 25.03.11 12:38

Dabei ist zu beachten, dass das ein Netzwerk-Tool für Novell ist.
Die Funktionen von Delphi können dies aber nicht nutzen.


OsCor - Fr 25.03.11 13:19

user profile iconjasocul hat folgendes geschrieben Zum zitierten Posting springen:
Dabei ist zu beachten, dass das ein Netzwerk-Tool für Novell ist.

Richtig.
Zitat:
Die Funktionen von Delphi können dies aber nicht nutzen.

Bis jetzt haben wir jedenfalls noch keinen Weg gefunden.


jasocul - Fr 25.03.11 14:03

Nichts ist unmöööglich. :wink:
Das Problem ist, dass Delphi nur Funktionen aus Windows (üblicherweise über die API) zur Verfügung stehen oder eigene Routinen.
Ein Zugriff auf Funktionen für Novell sind mir so nicht bekannt.

Falls das Tool über eine DLL verfügt, kann man es evtl. darüber versuchen. Möglicherweise ist die entsprechende Funktion dort enthalten.


Delphi-Laie - Sa 26.03.11 17:19

Interessant könnte in diesem Zusammenhang auch [url=http://www.michael-puff.de/Programmierung/Artikel/GetCurrentDirectory.shtml]ein Artikel Luckies[/url] sein.


OsCor - Mo 28.03.11 09:14

Danke. Das ist aber natürlich dasselbe, was Gausi weiter oben schon geschrieben hat. Das klappt ja. Problem ist, dass die Änderung des Netzwerkpfades durch Umbenennen von Paramstr(0) nicht erkannt wird.

Oswald


Delete - Mo 28.03.11 14:31

Natürlich wird das bemerkt beim nächsten Start. Während die Anwendung läuft natürlich nicht, weil die Parameter nur beim Start übergeben werden.