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/)
-   -   FTP URL in Bestandteile splitten (https://www.delphipraxis.net/50411-ftp-url-bestandteile-splitten.html)

Alois 25. Jul 2005 12:58


FTP URL in Bestandteile splitten
 
Hi,
ich versuche schon die ganze Zeit eine vernünftige Routine zum aufsplitten eines URL Stringes in seine Bestandteile zu programmieren. Komme aber irgendwie nicht weiter.

Ein String im Format 'ftp://benutzername:kennwort@hostname:21/Verzeichnis/Datei.txt' soll in seine Bestandteile zerlegt und mir in einzelnen Stringvariablen
  • Benutzername
  • Kennwort
  • Hostname
  • Port
  • Pfad
  • Dateiname
zurückliefern.

Hat schon jemand von euch so eine Routine programmiert. Ich wäre euch echt dankbar.

Gruss Alois ;)

Luckie 25. Jul 2005 13:07

Re: FTP URL in Bestandteile splitten
 
Zeig doch mal, was du schon hast.

Und warumn sthet das unter 'Programmieren allgemein'? Geht es nicht um Delphi?

MathiasSimmack 25. Jul 2005 13:10

Re: FTP URL in Bestandteile splitten
 
Mal so ins Blaue: Hier im Forum suchenInternetCrackUrl als erste Idee. Inwieweit das jetzt in dem Spezialfall mit dem Benutzernamen und Kennwort hilft, vermag ich natürlich nicht zu sagen. :stupid:

Die Muhkuh 25. Jul 2005 13:19

Re: FTP URL in Bestandteile splitten
 
Hi,

hier mal ein schnelles Quick and Dirty Beispiel. In wie weit das richtig funktioniert, weiß ich nicht, aber mit dem FTP-Dings im ersten Post geht es :mrgreen:

Delphi-Quellcode:
type
  TFTPURL = record
    Username, Password, Host, Path, FileName: String;
    Port: Integer;
  end;

// Die passende Funktion:

function ParseFTPURL(const FTPURL: String): TFTPURL;
var
  Temp: String;
begin
  Temp := FTPURL;

  Delete(Temp, 1, 6); // ftp:// entfernen

  Result.Username := Copy(Temp, 0, Pos(':', Temp) - 1); // Benutzername kopieren
  Delete(Temp, 1, Pos(':', Temp)); // Benutzername entfernen

  Result.Password := Copy(Temp, 1, Pos('@', Temp) - 1); // Kennwort kopieren
  Delete(Temp, 1, Pos('@', Temp)); // Kennwort entfernen

  Result.Host := Copy(Temp, 1, Pos(':', Temp) - 1); // Host kopieren
  Delete(Temp, 1, Pos(':', Temp)); // Host entfernen

  Result.Port := StrToInt(Copy(Temp, 1, Pos('/', Temp) - 1)); // Port kopieren
  Delete(Temp, 1, Pos('/', Temp)); // Port entfernen

  Temp := StringReplace(Temp, '/', '\', [rfReplaceAll]);
  Result.Path := ExtractFilePath(Temp);
  Result.FileName := ExtractFileName(Temp);
end;

// Aufruf (z.B.):
procedure TForm1.Button1Click(Sender: TObject);
var
  FTP: TFTPURL;
begin
  FTP := ParseFTPURL(FTP_URL);

  with RichEdit1.Lines do
  begin
    Add(FTP.Username);
    Add(FTP.Password);
    Add(FTP.Host);
    Add(IntToStr(FTP.Port));
    Add(FTP.Path);
    Add(FTP.FileName);
  end;
end;

jaenicke 25. Jul 2005 13:26

Re: FTP URL in Bestandteile splitten
 
Wieso denn so umständlich (das bezieht sich auf InternetCrackUrl...)? Ich meine, wenn die URL tatsächlich immer genau diese Form hat, muss doch nur mit Copy / Pos / Delete nacheinander durch die Bestandteile gegangen werden:
Delphi-Quellcode:
var
  tmpURL, Prot, User, Pass, Host, Dir, File, FileExt: String;

  function GetAndDelete(Delim: String): String;
  begin
    Result := Copy(tmpURL, 1, Pos(Delim, tmpURL) - 1);
    Delete(tmpURL, 1, Pos(Delim, tmpURL) + Length(Delim) - 1);
  end;

begin
  tmpURL := 'ftp://benutzername:kennwort@hostname:21/Verzeichnis/Datei.txt';
  Prot := GetAndDelete('://');
  User := GetAndDelete(':');
  Pass := GetAndDelete('@');
  //Und so weiter...
end;
Dann braucht man nicht InternetCrackUrl benutzen und das damit verbundene Speichermanagement entfällt.
Abgesehen davon kann man so auch auf Fehler besser reagieren, da man bei InternetCrackUrl nur weiß, dass es nicht geklappt hat, aber nicht wo... :wink:

Ich seh grad, so ähnlich aber nicht so kompakt hat es auch schon Spider gepostet...

Alois 25. Jul 2005 14:43

Re: FTP URL in Bestandteile splitten
 
Vielen Dank für eure Antworten. Das ging aber flott...
Werde ich gleich mal ausprobieren.

Noch 'ne Frage:
Wie rufe ich die Funktion CrackUrl eigentlich auf und wie habe ich Zugriff auf die einzelnen Variablen??
Delphi-Quellcode:
type
   TEasyURLComponents = record
     Scheme, HostName: string;
     Port: Integer;
     User, Password, UrlPath, ExtraInfo: string;
   end;
procedure CrackURL(const URL: string; decode, escape: Boolean; var data: TEasyURLComponents );
var
  uc: TURLComponents;
  flags: Cardinal;
begin
  ZeroMemory(@uc, sizeof(uc));
  uc.dwStructSize := sizeof(TURLComponents);

  with data do
  begin
    SetLength(Scheme, 10);
    uc.lpszScheme    := PChar(Scheme);
    uc.dwSchemeLength := Length(Scheme);

    SetLength(HostName, 200);
    uc.lpszHostName    := PChar(HostName);
    uc.dwHostNameLength := Length(HostName);

    SetLength(User, 200);
    uc.lpszUserName    := PChar(User);
    uc.dwUserNameLength := Length(User);

    SetLength(Password, 200);
    uc.lpszPassword    := PChar(Password);
    uc.dwPasswordLength := Length(Password);

    SetLength(UrlPath, 1000);
    uc.lpszUrlPath     := PChar(UrlPath);
    uc.dwUrlPathLength := Length(UrlPath);

    SetLength(ExtraInfo, 2000);
    uc.lpszExtraInfo   := PChar(ExtraInfo);
    uc.dwExtraInfoLength:= Length(ExtraInfo);
  end;

  flags := 0;
  // Converts encoded characters back to their normal form.
  if decode then flags := flags or ICU_DECODE;

  // Converts all escape sequences (%xx) to their corresponding characters.
  if escape then flags := flags or ICU_ESCAPE;

  if not InternetCrackUrl(PChar(URL), Length(URL), flags, uc) then
    RaiseLastWin32Error;

  with data do
  begin
    SetLength(Scheme,   uc.dwSchemeLength);
    SetLength(HostName, uc.dwHostNameLength);
    SetLength(User,     uc.dwUserNameLength);
    SetLength(Password, uc.dwPasswordLength);
    SetLength(UrlPath,  uc.dwUrlPathLength);
    SetLength(ExtraInfo, uc.dwExtraInfoLength);
    Port := uc.nPort;
  end;
end;
Greetz Alois ;)

Die Muhkuh 25. Jul 2005 14:45

Re: FTP URL in Bestandteile splitten
 
Delphi-Quellcode:
procedure Blubb;
var
  Data: TEasyURLComponents;
begin
  CrackURL('Deine gewünschte URL', true, true, Data);
  ShowMessage(Data.User);
end;

DP-Maintenance 25. Jul 2005 14:54

DP-Maintenance
 
Dieses Thema wurde von "Luckie" von "Programmieren allgemein" nach "Object-Pascal / Delphi-Language" verschoben.
Also soll es doch mit Delphi gelöst werden. Das nächste mal besser auf die Sparte achten.

Grendel 25. Jul 2005 15:11

Re: FTP URL in Bestandteile splitten
 
Oder per Regular Expression:
So in etwa müsste das hinkommen:

Code:
ftp://([^:|.*]*):+([^:|^@|.*]*)@+([^:|.*]*):*([0-9]*)([^\.|.*]*/+)(.*)
dabei wird allerdings davon ausgegangen, daß benutzername:passwort auch auf jeden fall gesetzt sind.

Match 1: Benutzername
Match 2: Kennwort
Match 3: Hostname
Match 4: Port
Match 5: Verzeichnis (mit / am Ende)
Match 6: Datei

Sollte mit TRegExpr von http://RegExpStudio.com funktionieren.

Bis neulich ...

[edit=Luckie]Smilies deaktiviert. Ausdruck in Code-Tags gesetzt. Mfg, Luckie[/edit]
[edit=Grendel]Mensch! Lass einem doch mal die Zeit selber zu korrigieren :)[/edit]

The-X 27. Jul 2005 19:51

Re: FTP URL in Bestandteile splitten
 
oder man bedient sich der Indy-Klasse TIdURI (mit i am Ende) die kann sowas auch


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:35 Uhr.
Seite 1 von 2  1 2      

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