![]() |
Pfad ermitteln
Hallo,
ich möchte ein Programm per ShellExecute starten (was ja nicht so schwer ist), zuvor überprüfe ich jedoch die Existenz der Datei, was nicht immer funktioniert... Denn statt "C:\Windows\System32\cmd.exe" kann man ja auch einfach nur "cmd" schreiben, ShellExecute führt beides korrekt aus, jedoch wie kann ich vorher überprüfen ob die Datei existiert? Denn mit einem einfachen fileexists('cmd') findet es natürlich keine Datei da dieser Pfad relativ zum Ort ist an dem das Programm ausgeführt wird... Gibt es eine Funktion um den Pfad zu "vervollständigen":?: Lg Peter PS: Fällt jemanden ein etwas aussagekräftigerer Titel ein? |
AW: Pfad ermitteln
|
AW: Pfad ermitteln
|
AW: Pfad ermitteln
Mit den beschriebenen Funktionen (zumindest vom Coffeecoder) wird auch nur der aktuelle (relative Pfad) in einen absoluten gewandelt. Es werden jedoch keine Umgebungsvariablen etc. ausgewertet.
Warum willst du eigentlich vorher prüfen ob die Datei existiert? ShellExecute liefert dir doch einen Rückgabewert. Zitat:
|
AW: Pfad ermitteln
Ja eben, wenn der kleiner als 33 ist, trat ein Fehler auf. Im Falle, dass die Datei nicht gefunden wurde, kann es ja nur ERROR_FILE_NOT_FOUND oder ERROR_PATH_NOT_FOUND sein.
|
AW: Pfad ermitteln
Zitat:
und in %PATHEXT% sind die nötigen Dateierweiterungen zu finden. Nun geht ShellExecute so vor: - ist ein kompletter (absoluter) Path (Pfad) angegeben, dann nutze diesen - ebenso sieht es mit der Extension (Dateierweiterung) aus - existiert kein Pfad, dann suche im aktuellen Arbeitsverzeichnis und in alle Pfaden aus %PATH% nach dieser Datei - fehlt auch noch die Dateierweiterung, dann probiere alles in %PATHEXT% durch, ob es soeine Datei gibt > beim Suchen wird immer der erste Fund genommen (gibt es z.b. .exe und .cmd , dann wird standardmäßig die EXE ausgeführt, weil es so in %PATHEXT% drinsteht) So, und mit diesen Informationen kannst du dir jetzt ein FileExists passend zum ShellExecute basteln, wenn du es unbedingt noch willst. |
AW: Pfad ermitteln
Die Windows API Funktion
![]() |
AW: Pfad ermitteln
Danke himitsu :thumb:
Ich habe mir jetzt eine Funktion gebastelt die das für mich erledigt...
Delphi-Quellcode:
Kritik & Anregungen zum Code erwünscht :wink:
type
TStringDynArray = array of string; //benötigte funktionen nicht von mir! function GetEnvVarValue(const VarName: string): string; var BufSize: Integer; // buffer size required for value begin // Get required buffer size (inc. terminal #0) BufSize := GetEnvironmentVariable(PChar(VarName), nil, 0); if BufSize > 0 then begin // Read env var value into result string SetLength(Result, BufSize - 1); GetEnvironmentVariable(PChar(VarName), PChar(Result), BufSize); end else // No such environment variable Result := ''; end; function Explode(const Separator, S: string; Limit: Integer = 0): TStringDynArray; var SepLen: Integer; F, P: PChar; ALen, Index: Integer; begin SetLength(Result, 0); if (S = '') or (Limit < 0) then Exit; if Separator = '' then begin SetLength(Result, 1); Result[0] := S; Exit; end; SepLen := Length(Separator); ALen := Limit; SetLength(Result, ALen); Index := 0; P := PChar(S); while P^ <> #0 do begin F := P; P := AnsiStrPos(P, PChar(Separator)); if (P = nil) or ((Limit > 0) and (Index = Limit - 1)) then P := StrEnd(F); if Index >= ALen then begin Inc(ALen, 5); SetLength(Result, ALen); end; SetString(Result[Index], F, P - F); Inc(Index); if P^ <> #0 then Inc(P, SepLen); end; if Index < ALen then SetLength(Result, Index); end; //meine beiden funktionen function getfullext(prefix: string; filename: string): string; var o: Integer; extes: TStringDynArray; begin // wenn der dateiname keine dateierweiterung enthält if (ExtractFileExt(filename) = '') then begin // alle möglichen dateierweiterungen laden extes := Explode(';', GetEnvVarValue('pathext')); // alle dateierweiterungen durchgehen for o := 0 to Length(extes) - 1 do // wenn die datei mit dieser dateierweiterung existiert if fileexists(prefix + filename + extes[o]) then begin filename := prefix + filename + extes[o]; break; end; end // wenn der dateiname eine dateierweiterung enthält else begin if fileexists(prefix + filename) then begin filename := prefix + filename; end; end; Result := filename; end; function getfullpath(filename: string): string; var pathes: TStringDynArray; i: Integer; begin // wenn die datei nicht existiert if not(fileexists(filename)) then begin // wenn der dateiname keinen pfad enthält if ExtractFilePath(filename) = '' then begin // alle möglichen pfade laden und aufsplitten pathes := Explode(';', GetEnvVarValue('path')); // alle pfade durchgehen for i := 0 to Length(pathes) - 1 do begin //passende erweiterung suchen filename := getfullext(pathes[i] + '\', filename); end; end // wenn der dateiname einen pfad enthält else begin //passende erweiterung suchen filename := getfullext('', filename); end; end; Result := filename; end; ... ShowMessage(getfullpath('cmd')); ShowMessage(getfullpath('cmd.exe')); ShowMessage(getfullpath('D:\Windows\System32\cmd')); ShowMessage(getfullpath('D:\Windows\System32\cmd.exe')); |
AW: Pfad ermitteln
Zitat:
Delphi-Quellcode:
// ungetestet
function MySearchPath(const filename:string):string; var Reg: TRegistry; newlen : Integer; filepart : PChar; begin newlen := MAX_PATH+300; SetLength(Result, newlen); newlen := SearchPath(nil, pchar(filename), nil, newlen, PChar(Result), filepart); if newlen > 0 then SetLength(Result, newlen) else result := ''; end; |
AW: Pfad ermitteln
Aber warum die Prüfung selber noch mal machen, wenn es schon die Funktion macht?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:13 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz