![]() |
Korrekten Dateinamen auslesen
Hi,
ist es irgendwie möglich, den korrekten Dateinamen aus einem String (der z.B. per ShellExecute ausgeführt werden kann) auszulesen? Mal ein paar Beispiele, was für Strings ich meine: - Dateiname steht in "Anführungsstrichen" - hinterm Dateinamen stehen noch Parameter - Doppel-Slashes \\ sollen ignoriert werden Gibt es so ne Funktion vielleicht schon :roll: |
Re: Korrekten Dateinamen auslesen
Hi Martin,
ich bin mir nicht sicher, was du mit dem Ignorieren von doppelten backslashes meinst, aber die folgende Funktion liefert dir die Zerlegung einer commandline in einer StringList:
Delphi-Quellcode:
Testen kannst du so:
uses
Classes, StrUtils; function CreateParamStrings(const CommandLine: String): TStrings; var s: String; p, pNext: PAnsiChar; begin Result := TStringList.Create; p := PChar(CommandLine); while p^ <> '' do begin if p^ <> ' ' then begin if p^ <> '"' then begin pNext := AnsiStrScan(p, ' '); SetLength(s, pNext - p); StrLCopy(PChar(s), p, Length(s)); p := pNext; end else s := AnsiDequotedStr(AnsiExtractQuotedStr(p, '"'), '"'); Result.Add(s); end; while (p^ <> '') and (p^ = ' ') do Inc(p); end; end;
Delphi-Quellcode:
Grüße vom marabu
procedure TDemoForm.TestButtonClick(Sender: TObject);
begin with CreateParamStrings('"c:\programme\eigene programme\test.exe" /i /n=123 "a b c"') do begin ShowMessage(Text); Free; end; end; |
Re: Korrekten Dateinamen auslesen
Zitat:
z.b. c:\\Windows\\datei.txt |
Re: Korrekten Dateinamen auslesen
Danke :thumb:
Werd wir den Code mal anschauen... Aber ich dachte da, an irgendeine Funktion, die es vielleicht irgendwo in der ShellAPI oder Windows-Unit gibt... Es gibt ja auch sowas wie z.B. ExtractFilePath (okay, ist in SysUtils) und da dachte ich, es gäbe vielleicht auch so was, was ich suche... Wenn Windows einen Befehl zum Ausführen bekommt, muss es den doch irgendwie auch auseinandernehmen: z.B. einmal die Datei und dann die Parameter, die der Datei übergeben werden... Wie macht das denn Windows intern??? :gruebel: Zitat:
C:\WINDOWS\system32\\notepad.exe eingebe, dann funzt das ohne Probleme... @mkinzler: Keine Ahnung, wie das in c/c++ ist... Da hab ich noch nie was mit Dateipfaden gemacht. Edit: Hab grad festgestellt, bei FileExists klappt's auch mit den Doppel-Slashes. Allerdings klappt's nicht, wenn der Dateiname in "Anführungsstrichen" steht. Parameter nach dem Dateinamen gehen natürlich auch nicht. |
Re: Korrekten Dateinamen auslesen
Zitat:
Genauso wie Windows auch mit "/" (aus der Linux-Welt) zurechtkommt. |
Re: Korrekten Dateinamen auslesen
@himitsu:
Na schön, hilft mir aber auch nicht wirklich viel weiter. Man könnte ja auch per StringReplace ganz einfach \\ durch \ ersetzen... Aber mir geht es ja eigentlich darum, wie Windows Execute-Befehle verarbeitet. Da muss es doch auch irgendwie eine fertige Funktion geben, hab aber bis jetzt keine gefunden :roll: Vielleicht schreib ich mal mein eigentliches Ziel: Ich will mir alle Autostart-Einträge aus der Registry auslesen und anzeigen lassen. Damit das ganze schöner aussieht, soll auch zu jedem Programm was im Autostart steht das passende Icon angezeigt werden. Da aber die Dateinamen der Programme meißtens noch mit irgendwelchen Parametern hinten dran oder mit Anführungsstrichen da stehen (bei einem waren noch die Doppelslashes), ist es doch schwierig den Eintrag aus der Registry einfach so als FileName für die Icons zu verwenden :? |
Re: Korrekten Dateinamen auslesen
Na wenn es dir nur darum geht, dann sollte das schon ausreichen:
Delphi-Quellcode:
Var i: Integer;
B: Boolean; S, Dateiname, Parameter: String;
Delphi-Quellcode:
Im Grunde ist das Leerzeichen das trennzeichen zwischen Dateiname und einzelnen Parametern.
S := ...
i := 1; B := False; While (i <= Length(S)) and ((S[i] <> ' ') or B) do Begin If S[i] = '"' Then B := not B; Inc(i); End; Dateiname := StringReplace(Trim(Copy(S, 1, i - 1)), '"', '', [rfReplaceAll]); Parameter := Trim(Copy(S, i + 1, Length(S))); Wobei innerhalb der "" das Leerzeichen mit zum Dateiname/Parameter gehört. Hab das hier nur mal für den ersten Parameter (also den Dateinamen) verwirklicht ... die Parameter sind also immernoch in einem Gesamtstring enthalten. So ähnlich wird es auch gemacht, wenn Delphi den übergebenen Parametersting für ParamStr aufteilt. |
Re: Korrekten Dateinamen auslesen
Nur der Vollständigkeit halber:
Delphi-Quellcode:
Und weg sind die doppelten (back)slashes.
function CanonicalFileName(fn: TFileName): TFileName;
var buf: array [0..MAX_PATH] of Char; pc: PChar; begin SetString(Result, PChar(@buf), GetFullPathName(PChar(fn), MAX_PATH, PChar(@buf), pc)); end; marabu |
Re: Korrekten Dateinamen auslesen
@marabu
Gibt es einen besonderen Grund dafür, die Eigenschaft TStringList.DelimitedText nicht zu verwenden?
Delphi-Quellcode:
Die von dir schon einmal beschriebene Design-Schwäche in TStringList stört doch nur in dem Fall, wo das Trennzeichen kein Blank ist.
with TStringList.Create do
begin DelimitedText := '"c:\programme\eigene programme\test.exe" /i /n=123 "a b c"'; ShowMessage(Text); Free; end; Gruß Hawkeye |
Re: Korrekten Dateinamen auslesen
Danke :thumb:
Ihr hat euch ja richtig viel Mühe gegeben, war doch nicht nötig gewesen :lol: Schade, dass es sowas nicht schon fertig gibt, na egal... Hab jetzt den QT von Hawkeye219 noch etwas ergänzt:
Delphi-Quellcode:
@himitsu und marabu:
function StrToPath(const s: String): String;
var SL: TStringList; begin if (s<>'') and (s[1]='"') then begin SL := TStringList.Create; try SL.DelimitedText := s; Result := SL[0]; finally SL.Free; end; end else Result := s; Result := StringReplace(Result, '\\', '\', [rfReplaceAll]); end; Hab jetzt von euch nix drin :pale: , gibt es evtl. Vorteile in euren Codes gegenüber meinem? Edit: Code verändert, dann meckert auch der Compiler nicht mehr. Funzt übrigens 1A :thumb: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:55 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