![]() |
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! |
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 |
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 |
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 |
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. |
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 |
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:
Gruß, Alleinherrscer
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:52 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 by Thomas Breitkreuz