AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language ExtractFilePath aus einem String mit zwei Dateiangaben
Thema durchsuchen
Ansicht
Themen-Optionen

ExtractFilePath aus einem String mit zwei Dateiangaben

Ein Thema von globalenemy · begonnen am 24. Mär 2014 · letzter Beitrag vom 25. Mär 2014
Antwort Antwort
Seite 1 von 2  1 2      
globalenemy

Registriert seit: 24. Mär 2014
10 Beiträge
 
#1

ExtractFilePath aus einem String mit zwei Dateiangaben

  Alt 24. Mär 2014, 20:29
Delphi-Version: 7
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: ExtractFilePath aus einem String mit zwei Dateiangaben

  Alt 24. Mär 2014, 20:36
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.
$2B or not $2B
  Mit Zitat antworten Zitat
globalenemy

Registriert seit: 24. Mär 2014
10 Beiträge
 
#3

AW: ExtractFilePath aus einem String mit zwei Dateiangaben

  Alt 24. Mär 2014, 21:15
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. :\
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#4

AW: ExtractFilePath aus einem String mit zwei Dateiangaben

  Alt 24. Mär 2014, 21:19
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;
  Mit Zitat antworten Zitat
nuclearping

Registriert seit: 7. Jun 2008
708 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

AW: ExtractFilePath aus einem String mit zwei Dateiangaben

  Alt 24. Mär 2014, 21:25
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"
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.175 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: ExtractFilePath aus einem String mit zwei Dateiangaben

  Alt 24. Mär 2014, 21:32
Hallo und herzlich willkommen in der 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.
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)

Geändert von juergen (24. Mär 2014 um 21:34 Uhr) Grund: Edit: ich sehe jetzt erst den 3. Post ??? Dann geht das natürlich nicht.
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.682 Beiträge
 
Delphi 5 Professional
 
#7

AW: ExtractFilePath aus einem String mit zwei Dateiangaben

  Alt 24. Mär 2014, 21:41
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

Geändert von Dalai (24. Mär 2014 um 21:44 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.175 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: ExtractFilePath aus einem String mit zwei Dateiangaben

  Alt 24. Mär 2014, 21:53
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
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)

Geändert von juergen (24. Mär 2014 um 22:16 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: ExtractFilePath aus einem String mit zwei Dateiangaben

  Alt 24. Mär 2014, 22:00
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.
$2B or not $2B
  Mit Zitat antworten Zitat
globalenemy

Registriert seit: 24. Mär 2014
10 Beiträge
 
#10

AW: ExtractFilePath aus einem String mit zwei Dateiangaben

  Alt 24. Mär 2014, 22:09
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\"
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 15:33 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