Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   ExtractFilePath aus einem String mit zwei Dateiangaben (https://www.delphipraxis.net/179687-extractfilepath-aus-einem-string-mit-zwei-dateiangaben.html)

globalenemy 24. Mär 2014 19:29

Delphi-Version: 7

ExtractFilePath aus einem String mit zwei Dateiangaben
 
Grüße,

Ich möchte gerne aus einem String den Pfad zu einer Datei holen. Das soll ja ganz einfach mit ExtractFilePath aus SysUtils gehn, allerdings enthält mein String auch die zu übergebenden Parameter.
Wie kann ich den Pfad der gewünschten Datei holen, wenn in den Parametern Dateien bzw. Pfadangaben zu finden sind?

ExtractFilePath("C:\Hello\You.exe C:\Bye\You.exe")
returns: "C:\Hello\You.exe C:\Bye\"
i want: "C:\Hello\"

ps: Es ist nicht gegeben, dass der Dateiname immer mit .exe endet.

himitsu 24. Mär 2014 19:36

AW: ExtractFilePath aus einem String mit zwei Dateiangaben
 
Es ist ganz "einfach" Du mußt zuerst die beiden Dateien auftrennen, also den Pfad von den Parametern trennen.

Und dann kannst du mit ExtractFilePath den Dateinamen rausholen.

Tipp:
Wenn der Pfad mit " anfängt, dann das nächste " suchen und dazwischen ist nun der Pfad.
Fängt es nicht mit " an, dann nach dem ersten Leerzeichen suchen und davor steht dann der Pfad.

globalenemy 24. Mär 2014 20:15

AW: ExtractFilePath aus einem String mit zwei Dateiangaben
 
hmm. Ich komm damit leider noch nicht weiter. Ich weiß nicht wie ich den Dateinamen von den Parametern trennen soll.

Der String könnte schließlich auch so aussehen:
Code:
C:\Hey.Hello There\You.exe C:\Ok.Bye Then\You.exe
Ich kann nicht auf Leerzeichen trennen. Ich kann auch nicht auf den Punkt trennen. :\

Popov 24. Mär 2014 20:19

AW: ExtractFilePath aus einem String mit zwei Dateiangaben
 
Vorausgesetzt da ist kein Netzwerk-Pfad drin:

Delphi-Quellcode:
uses
  StrUtils;

procedure TForm1.Button1Click(Sender: TObject);
var
  s, s1, s2: String;
  p1, p2: Integer;
begin
  s := '"C:\Hello\You.exe C:\Bye\You.exe"';

  if Length(s) > 0 then //entfent Anführungszeichen, falls vorhenden
    if s[1] = '"' then Delete(s, 1, 1);

  if Length(s) > 0 then //entfent Anführungszeichen, falls vorhenden
    if s[Length(s)] = '"' then Delete(s, Length(s), 1);

  p1 := PosEx(':\', s, 0); //Für PosEx StrUtils in uses einfügen
  p2 := PosEx(':\', s, p1 + 1);

  if p2 > p1 then
  begin
    s1 := Copy(s, 1, p2 - 1);
    s2 := Copy(s, P2 - 1, MaxInt);
  end
  else
  begin
    s1 := s;
    s2 := '';
  end;

  ShowMessage(
    'Path1: ' + ExtractFilePath(s1) + ^j +
    'Path2: ' + ExtractFilePath(s2));
end;

nuclearping 24. Mär 2014 20:25

AW: ExtractFilePath aus einem String mit zwei Dateiangaben
 
Man kann auch eine TStringList mit DelimitedText und QuoteChar nehmen. Die macht den ganzen Spaß alleine.

http://www.delphibasics.co.uk/RTL.asp?Name=TStringList

3. Beispiel:
Delphi-Quellcode:
var
  cars : TStringList;           // Define our string list variable
  i   : Integer;
begin
  // Define a string list object, and point our variable at it
  cars := TStringList.Create;

  // Now add some cars to our list - using the DelimitedText property
  // with overriden control variables
  cars.Delimiter := ' ';       // Each list item will be blank separated
  cars.QuoteChar := '|';       // And each item will be quoted with |'s
  cars.DelimitedText := '|Honda Jazz| |Ford Mondeo| |Jaguar "E-type"|';

  // Now display these cars
  for i := 0 to cars.Count-1 do
    ShowMessage(cars[i]);      // cars[i] equates to cars.Strings[i]

  // Free up the list object
  cars.Free;
end;
Ausgabe:
Code:
   Honda Jazz
   Ford Mondeo
   Jaguar "E-type"

juergen 24. Mär 2014 20:32

AW: ExtractFilePath aus einem String mit zwei Dateiangaben
 
Hallo und herzlich willkommen in der DP! :dp:

ich würde es für einen Anwendungsfall so machen wie himitsu es schon gesagt hat, wenn der Parameter durch ein Leerzeichen eingeleitet wird unfd im Pfad keine Leerzeichen vorhanden sind.

Delphi-Quellcode:
ExtractFilePath(copy('"C:\Hello\You.exe C:\Bye\You.exe"',
  pos(' ', ('"C:\Hello\You.exe C:\Bye\You.exe"')), Length('"C:\Hello\You.exe C:\Bye\You.exe"')));
Ich hoffe ich habe jetzt alles richtig getippt.

Dalai 24. Mär 2014 20:41

AW: ExtractFilePath aus einem String mit zwei Dateiangaben
 
Ich hatte vor wenigen Wochen ebenfalls mit diesem Thema zu tun. Erst hatte ich versucht, das alles selbst mit entsprechender Stringbearbeitung zu machen, bis mir irgendwann auffiel, dass Microsoft diese Arbeit schon getan hat. Und da man das Rad nicht immer wieder neu erfinden muss, hab ich dann auf diese Funktionen zurückgegriffen. Stichworte: MSDN-Library durchsuchenPathRemoveArgs, MSDN-Library durchsuchenPathUnquoteSpaces, ggf. MSDN-Library durchsuchenPathAddExtension und noch ein paar andere. Ich empfehle daher dringend, diese Funktionen zu benutzen statt der manuellen Bearbeitung der Strings.

Es gibt sogar Deklarationen der Funktionen hier im Forum für den Fall, dass sie in deinem Delphi fehlen sollten. Für ein Unicode-Delphi sollte man allerdings die Deklarationen anpassen (Stichwort $IFDEF UNICODE).

MfG Dalai

juergen 24. Mär 2014 20:53

AW: ExtractFilePath aus einem String mit zwei Dateiangaben
 
Hallo,

die Regel scheint zu sein, dass bis zum 2. Backslash der Dateipfad ist, oder?
Dann vllt. so:
Delphi-Quellcode:
s := '"C:\Hello\You.exe C:\Bye\You.exe"';
  (ExtractFilePath(copy(s, 2, (posex('\', (s), 5)))));
Edit: Sorry, ich hatte beim Überprüfen mit Delphi eben festgestellt, dass ich einen Denkfehler hatte.
Der jetzige Code sollte funktionieren

himitsu 24. Mär 2014 21:00

AW: ExtractFilePath aus einem String mit zwei Dateiangaben
 
Zitat:

Zitat von globalenemy (Beitrag 1253314)
Der String könnte schließlich auch so aussehen:
Code:
C:\Hey.Hello There\You.exe C:\Ok.Bye Then\You.exe

Nein, kann es nicht, bzw. sollte es nicht.

Alle ordentlichen Programme, welche Pfade via Parameter übergeben, machen die "..." drumrum, wenn sich Leerzeichen im Pfadnamen befinden.

globalenemy 24. Mär 2014 21:09

AW: ExtractFilePath aus einem String mit zwei Dateiangaben
 
Vielen Dank für Eure Antworten! :-*

Mit dem Post von Popov konnte ich mein Problem lösen.

Code:
procedure TForm1.CheckBox1Click(Sender: TObject);
var
  St1: String;
  Int1, Int2: Integer;
begin
  if CheckBox1.Checked = True then
    begin
      if Edit1.Text[1] <> '\' then
        begin
          Edit2.Enabled := True;
          St1 := Edit1.Text;
          Int1 := PosEx(':\', St1, 0);
          Int2 := PosEx(':\', St1, Int1 + 1);
          if Int2 > Int1 then Edit2.Text := ExtractFilePath(Copy(St1, 1, Int2 - 1))
          else Edit2.Text := ExtractFilePath(St1);
        end
      else Edit2.Text := ExtractFilePath(Edit1.Text);
      ActiveControl := Edit2;
    end
  else
    begin
      Edit2.Enabled := False;
      Edit2.Text := ' override working path...';
    end;
end;
"C:\Hey.Hello There\You.exe C:\Ok.Bye Then\You.exe"
= "C:\Hey.Hello There\"


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:48 Uhr.
Seite 1 von 2  1 2      

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