AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Korrekten Dateinamen auslesen

Ein Thema von Martin K · begonnen am 12. Jun 2006 · letzter Beitrag vom 13. Jun 2006
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von Martin K
Martin K

Registriert seit: 20. Okt 2005
919 Beiträge
 
Turbo Delphi für Win32
 
#1

Korrekten Dateinamen auslesen

  Alt 12. Jun 2006, 16:51
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
Mit den Menschen ist es wie mit Computern -
es gibt Nullen und Einsen.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Korrekten Dateinamen auslesen

  Alt 12. Jun 2006, 20:03
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:
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;
Testen kannst du so:

Delphi-Quellcode:
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;
Grüße vom marabu
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Korrekten Dateinamen auslesen

  Alt 12. Jun 2006, 20:05
Zitat:
ich bin mir nicht sicher, was du mit dem Ignorieren von doppelten backslashes meinst
Ich glaube er spielt auf die Tatsache an das in c/c++ Backslashes als Steuerzeichen verwendet werden, un deshalb bei Ausgaben diese doppelt angegeben werden müßen:

z.b. c:\\Windows\\datei.txt
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Martin K
Martin K

Registriert seit: 20. Okt 2005
919 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Korrekten Dateinamen auslesen

  Alt 12. Jun 2006, 20:14
Danke
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???


Zitat von marabu:
Hi Martin,

ich bin mir nicht sicher, was du mit dem Ignorieren von doppelten backslashes meinst, [...]
Naja, mir ist mal aufgefallen wenn ich z.B. in Start -> Ausführen
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.
Mit den Menschen ist es wie mit Computern -
es gibt Nullen und Einsen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

Re: Korrekten Dateinamen auslesen

  Alt 12. Jun 2006, 20:30
Zitat von Martin K:
Naja, mir ist mal aufgefallen wenn ich z.B. in Start -> Ausführen
C:\WINDOWS\system32\\notepad.exe eingebe, dann funzt das ohne Probleme...
WinNT (also auch XP, wobei anscheinend Win98 damit nicht lar kommmt) irnoriert dieses "\\" ... du kannst also auch einen Dateinamen mit "\\" an ShellExecute übergeben.
Genauso wie Windows auch mit "/" (aus der Linux-Welt) zurechtkommt.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Martin K
Martin K

Registriert seit: 20. Okt 2005
919 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Korrekten Dateinamen auslesen

  Alt 12. Jun 2006, 20:44
@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

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
Mit den Menschen ist es wie mit Computern -
es gibt Nullen und Einsen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#7

Re: Korrekten Dateinamen auslesen

  Alt 12. Jun 2006, 21:09
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:
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)));
Im Grunde ist das Leerzeichen das trennzeichen zwischen Dateiname und einzelnen Parametern.
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.
$2B or not $2B
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#8

Re: Korrekten Dateinamen auslesen

  Alt 12. Jun 2006, 21:18
Nur der Vollständigkeit halber:

Delphi-Quellcode:
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;
Und weg sind die doppelten (back)slashes.

marabu
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#9

Re: Korrekten Dateinamen auslesen

  Alt 12. Jun 2006, 21:36
@marabu

Gibt es einen besonderen Grund dafür, die Eigenschaft TStringList.DelimitedText nicht zu verwenden?

Delphi-Quellcode:
with TStringList.Create do
begin
  DelimitedText := '"c:\programme\eigene programme\test.exe" /i /n=123 "a b c"';
  ShowMessage(Text);
  Free;
end;
Die von dir schon einmal beschriebene Design-Schwäche in TStringList stört doch nur in dem Fall, wo das Trennzeichen kein Blank ist.

Gruß Hawkeye
  Mit Zitat antworten Zitat
Benutzerbild von Martin K
Martin K

Registriert seit: 20. Okt 2005
919 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: Korrekten Dateinamen auslesen

  Alt 12. Jun 2006, 21:59
Danke
Ihr hat euch ja richtig viel Mühe gegeben, war doch nicht nötig gewesen

Schade, dass es sowas nicht schon fertig gibt, na egal...

Hab jetzt den QT von Hawkeye219 noch etwas ergänzt:
Delphi-Quellcode:
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;
@himitsu und marabu:
Hab jetzt von euch nix drin ,
gibt es evtl. Vorteile in euren Codes gegenüber meinem?

Edit:
Code verändert, dann meckert auch der Compiler nicht mehr.
Funzt übrigens 1A
Mit den Menschen ist es wie mit Computern -
es gibt Nullen und Einsen.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:18 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz