Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi url entschlüßeln (https://www.delphipraxis.net/463-url-entschluesseln.html)

theomega 25. Jul 2002 16:44


url entschlüßeln
 
Hallo wie bekomme ich mit delphi aus dem String

http://www.microsoft.com/download/teset/office2k.exe den Namen office2k.exe heraus. Es geht also um den Dateinamen in einer URL. Und egal wie tief in der Verzeichnissstruktur??

CalganX 25. Jul 2002 16:54

Weißt du, wie lang der Dateiname ist?

Chris

Christian Seehase 25. Jul 2002 16:55

Moin TheOmega,

nimm mal einen Button, ein Edit und dann probiers mal im OnClick des Button hiermit:

Code:
ShowMessage(copy(Edit1.Text,LastDelimiter('/',Edit1.Text)+1,Length(Edit1.Text)));
Das mal als Beipspiel.

Theoretisch müsste sich auch ExtractFileName eignen, aber leider hat Borland dabei übersehen, das der Slash (/) ebenso als Trennzeichen dienen darf wie der Backslash. (und dass sogar gemischt)

jbg 25. Jul 2002 17:46

Zitat:

Zitat von Christian Seehase
leider hat Borland dabei übersehen, das der Slash (/) ebenso als Trennzeichen dienen darf wie der Backslash. (und dass sogar gemischt)

So kannst du das aber nicht sagen, denn Unter DOS/OS2/Windows Betriebsystemen dient nur, und wirklich nur des Backslash als Trennzeichen für Ordner. Wenn das Programm unter Linux mit Kylix kompiliert werden würde, dann reagiert ExtractFileName nur auf '/' aber nicht auf '\'. Aber solange man nur für Windows entwickelt muss man sich mit dieser Problematik nicht auseinandersetzen. Für URLs die auf Unix-Pfadangaben basieren muss man dann eben seine eigenen Routinen schreiben und dann ggf. in einer eigenen Unit auslagern, so dass man auch in anderen Projekten darauf zugreifen kann.

theomega 25. Jul 2002 17:56

@Christian Seehase deine Lösung funzt, danke.

Christian Seehase 25. Jul 2002 19:06

Moin jbg,

Zitat:

Zitat von jbg
...Windows Betriebsystemen dient nur, und wirklich nur des Backslash als Trennzeichen für Ordner...

sorry, aber da irrst Du.
Unter Windows sind als Trennzeichen von Pfadelementen Slash und Backslash zugelassen (gleichberechtigt).
Der Backslash ist halt nur üblich, aber, zumindest unter Windows (32Bit) nicht zwingend.
Genau wie gerne übersehen wird, dass der Punkt auch am Anfang eines Datei oder Ordnernamens stehen darf (oder mehrere).
Probier doch mal folgendes aus (sl ist vom Typ TStringList):

Code:
sl.SaveToFile('c:\temp/diesmal mit Slash\und mit Backslash/gemischt\....Datei.txt');
Voraussetzung ist natürlich, dass der Pfad existiert.

Da, wie schon erwähnt, Borland diese Eigenart des Dateisystemes nicht berücksichtigt hat, kann man den Pfad allerdings nicht mit ForceDirectories anlegen.
Auch dass es nicht störend ist, wenn mehrere Trenner unmittelbar hintereinander stehen haben sie nicht berücksichtigt.
Folgendes macht zwar keinen Sinn, funktioniert aber (und sollte, falls man den Pfade parsen will auch berücksichtigt werden):

Code:
sl.SaveToFile('c:\temp/diesmal mit Slash\/\/\/\/und mit Backslash/gemischt\....Datei.txt');
Nochmal kurz zu den Punkten am Anfang eines Dateinamens:
Beim Durchsuchen eines Verzeichnisbaumes mit FindFirst usw. wird gerne übersehen, dass explizit nach (SearchRec.Name <> '.') and (SearchRec.Name <> '..') gefiltert werden muss und nicht nach SearchRec.Name[1] <> '.'.
Diesen Fehler sieht man, leider, oft, auch wenn er sehr oft keine Auswirkung hat. Dadurch wird's allerdings nicht richtiger. ;-)

sakura 25. Jul 2002 22:31

Nur noch als abschliessender Tipp: Du solltest in den URLs auch auf Fragezeichen (?) und Rauten (#) achten, da diese direkt nach dem Dateinamen auf Parameter bzw. interne Dokumentziele verweisen können.

:cat:

Robert 4. Jan 2003 18:16

Delphi-Quellcode:
function extractURLFile(URL:STRING):STRING;
var I,iLast,iFirst:INTEGER;
begin
  iLast:=LENGTH(URL)+1;
  iFirst:=1;
  FOR I:=LENGTH(URL) DOWNTO 1 DO
    BEGIN
      IF URL[I] = '/' THEN
        BEGIN
          iFirst:=I+1;
          BREAK;
        END
      ELSE IF URL[I] = '?' THEN iLast:=I;

    END;
  Result:=COPY(URL,iFirst,iLast-iFirst);
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:51 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