Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi HTTP Server -> genauen Dateinamen ermitteln?! (https://www.delphipraxis.net/50891-http-server-genauen-dateinamen-ermitteln.html)

alleinherrscher 2. Aug 2005 12:10


HTTP Server -> genauen Dateinamen ermitteln?!
 
Hi, Leute! Sorry, dass ich euch schon wieder nerve!

Folgenes: ich möchte von einem HTTP Server eine Datei runterladen. Es handelt sich um Updates. Das updatefile ist folgendermaßen zusammengesetzt xxxx[fester-string-teil].exe (also beispielsweise 4212update.exe, 4817update.exe usw...) wobei xxxx theoretisch eine zahl von 0001 bis 9999 sein kann.
Wie kann ich vor dem download herausfinden, welche xxxx nummer bzw. welcher dateiname gerade aktuell ist, wenn ich nicht alle möglichkeiten von 1 bis 9999 ausprobieren möchte? ;-)

Gruß Alleinherrscher!

marabu 2. Aug 2005 12:33

Re: HTTP Server -> genauen Dateinamen ermitteln?!
 
Hi,

unter den geschilderten Randbedingungen würde ich mir die zuletzt geladene Nummer merken und beim nächsten Update-Versuch von dieser Nummer ausgehend suchen. Suchen heißt ja nicht, dass du gleich die ganze Datei laden musst. Du könntest erst eine Existenzprüfung machen um unnötige Ladevorgänge zu vermeiden.

Grüße vom marabu

alleinherrscher 2. Aug 2005 12:46

Re: HTTP Server -> genauen Dateinamen ermitteln?!
 
Thx soweit! Aber so eine Art Wildcat gibts nicht oder?

Also z.B. lade die Datei *update.exe oder liste alle dateien auf und gib sie mir in eine varriable die die spezifikation *.exe haben oder sowas?

Gruß Alleinherrscher

marabu 2. Aug 2005 17:58

Re: HTTP Server -> genauen Dateinamen ermitteln?!
 
Es geht schon noch um HTTP - oder? Keine wild cards. Ärgerlich ist das, wenn die Nummernfolge nicht lückenlos ist, weil du dann eventuell viele vergebliche Anfragen verschicken musst. Offensichtlich will der Betreiber der web site keine automatischen downloads unterstützen, sonst würde er die jeweils aktuelle Fassung des update files unter einem festen Namen anbieten.

Falls die updates auch über FTP angeboten werden, dann stehen dir beim FTP command LIST wild cards zur Verfügung. Aber würdest du damit viel gewinnen? Liegen denn wirklich Unmengen an Dateien im gleichen Verzeichnis neben den 10.000 update files? Werden diese update files nicht ohnehin schon in einem eigenen Verzeichnis gehalten?

Merkwürdig...

marabu

SirThornberry 2. Aug 2005 19:21

Re: HTTP Server -> genauen Dateinamen ermitteln?!
 
updates unter gleichem Namen macht der Anbieter vermutlich nicht weil es dann immer wieder zu problem mit läuten kommt die ihren Cache nicht leeren. Resultat ist dann das leute immer wieder die gleiche Version "herunterladen" weil immer wieder die version aus dem cache genommen wird (ist kein theoretiches problem, hab ich selbst schon im support erlebt)

zum eigentlichen thema: Außer probieren wird nichts weiter übrig bleiben da http darauf beruht das man sagt "gib mir genau das" und bekommt dann auch genau das oder eben eine Fehlermeldung wenn es nicht existiert.

matze.de 2. Aug 2005 19:50

Re: HTTP Server -> genauen Dateinamen ermitteln?!
 
Nimm ne *.txt die immer gleich heißt schreib in die File die neue Versionsnummer rein und hol dir die mit deinem Programm ab.. Warum einfach, wenns auch kompliziert geht?

mfg matze

alleinherrscher 2. Aug 2005 20:44

Re: HTTP Server -> genauen Dateinamen ermitteln?!
 
So hab ichs gemacht Matze! Zwar kann es vorkommen, dass 2,3 vergebliche anfragen gesendet werden (ca. 2 sekunden pro anfrage) aber dat is ja egal...vielen dank an alle!

Grüße, Alleinherrscher

Für alle die, dies interessiert hab ich hier mal den Quelltext:

Delphi-Quellcode:
function HTTPFileExists(aURL: String): Boolean;
begin
  with TIdHTTP.Create(nil) do
  try
    try
      Head(aURL);
      Result := ResponseCode = 200;
    except
      Result := False;
    end;
  finally
    Free;
  end;
end;

Function TForm1.GetFileFromInet(Const fileURL, AFileNameToSave: String) : Boolean;
Const
  BufferSize = 1024;
Var
  sAppName: String;
  hSession, hURL: hInternet;
  buffer: Array[1..BufferSize] Of Byte;
  bufferLen: DWord;
  mem: TMemoryStream;
Begin
  Result := False;
  sAppName := ExtractFileName(Application.ExeName);
  hSession := InternetOpen(PChar(sAppName), INTERNET_OPEN_TYPE_PRECONFIG, Nil, Nil, 0);
  If ( hSession <> Nil ) Then
  Begin
    Try
      hURL := InternetOpenURL(hSession, PChar(fileURL), Nil, 0, 0, 0);
      If ( hURL <> Nil ) Then
      Begin
        Try
          mem := TMemoryStream.Create;
          Repeat
            application.ProcessMessages;
            BufferLen := 0;
            InternetReadFile(hURL, @Buffer, SizeOf(Buffer), BufferLen);
            mem.Write(buffer, bufferlen);
          Until bufferLen = 0;
          mem.SaveToFile(AFileNameToSave);
             
          mem.Free;
          Result := True;
        Finally
          InternetCloseHandle(hURL);
        End;
      End;
    Finally
      InternetCloseHandle(hSession);
    End;
  End;
End;

procedure TForm1.Button1Click(Sender: TObject);
var Fehler:boolean;
datei:textfile;
version:string;
StreamObject:tmemorystream;

begin

assignfile(datei,pfad+'version.txt');
reset(datei);
readln(datei,version);
closefile(datei);

memo1.lines.add('Version auf dem Rechner: '+version);

i:=strtoint(version);

memo1.lines.add('Suche nach neuster Version...');
while HTTPFileExists('http://...'+inttostr(i)+'.exe')=false do
begin
inc(i);
application.ProcessMessages;
end;
memo1.lines.add('neuste Version: '+inttostr(i));

if inttostr(i)<>version then begin
memo1.lines.add('Lade neue Version herunter. Bitte waren...');
GetFileFromInet('http://...'+inttostr(i)+'.exe',pfad+inttostr(i)+'.exe')
end
else begin
update:=False;
memo1.lines.add('Ihre Files sind auf dem neusten Stand.');
exit;
end;
update:=True;
memo1.lines.add('Download komplett. Starte Update...');
memo1.Lines.add('Befolgen Sie die Anweisungen auf dem Bildschirm...');
ShellExecute(hinstance,'open',pchar(inttostr(i)+'.exe'),nil,pchar(pfad),sw_show);

assignfile(datei,pfad+'version.txt');
rewrite(datei);
writeln(datei,inttostr(i));
closefile(datei);


end;
Gruß, Alleinherrscer


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