Größe einer herunterzuladenden Datei ermitteln

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Größe einer herunterzuladenden Datei ermitteln

Beitrag von Kiffi »

Ich habe hier ein leicht abgewandeltes Beispiel aus der PB-Dokumentation, um eine Datei aus dem Internet herunterzuladen:

Code: Alles auswählen

EnableExplicit

Define Download, Progress, Size

InitNetwork()

Download = ReceiveHTTPFile("http://www.purebasic.com/download/OgreAssimpConverter.zip", GetTemporaryDirectory() + "OgreAssimpConverter.zip", #PB_HTTP_Asynchronous)

If Download
  
  Repeat
    
    Progress = HTTPProgress(Download)
    
    Select Progress
        
      Case #PB_HTTP_Success
        Size = FinishHTTP(Download)
        Debug "Download finished (size: " + Size + ")"
        Break
        
      Case #PB_HTTP_Failed
        Debug "Download failed"
        Break
        
      Case #PB_HTTP_Aborted
        Debug "Download aborted"
        Break
        
      Default
        Debug "Current download: " + Progress
        
    EndSelect
    
    Delay(500)
    
  ForEver
  
Else
  
  Debug "Download error"
  
EndIf
Funktioniert auch soweit ganz gut. Nun möchte ich gerne vor dem Download wissen, wie groß diese Datei ist, damit ich ausgeben kann, wie viel Prozent schon heruntergeladen wurden.

Wie geht das?

Danke im Voraus & Grüße ... Peter
Hygge
Benutzeravatar
Shardik
Beiträge: 738
Registriert: 25.01.2005 12:19

Re: Größe einer herunterzuladenden Datei ermitteln

Beitrag von Shardik »

Du kannst vorher GetHTTPHeader() verwenden um die Dateigröße zu ermitteln. Mein Beispiel ist plattformunabhängig, und ich habe es gerade erfolgreich auf MacOS 10.6.8 'Snow Leopard' mit PB 5.62 x86 getestet:

Code: Alles auswählen

#URL = "https://www.purebasic.com/download/OgreAssimpConverter.zip"

If InitNetwork()
  Header$ = GetHTTPHeader(#URL)
  
  Repeat
    Index + 1
    Line$ = StringField (Header$, Index, #LF$ )
    
    If FindString (Line$, "Content-Length:", 1)
      FileSize = Val(StringField (Line$, 2, ":"))
      Break
    EndIf
  Until Line$ = ""
  
  MessageRequester("Info", "Dateigröße: " + FileSize + " Bytes")
EndIf
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: Größe einer herunterzuladenden Datei ermitteln

Beitrag von Mijikai »

Optional wenn OS = Windows

Code: Alles auswählen

;HttpQueryInfo_() mit -> #HTTP_QUERY_FLAG_NUMBER|#HTTP_QUERY_CONTENT_LENGTH
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Größe einer herunterzuladenden Datei ermitteln

Beitrag von Kiffi »

Perfekt, vielen Dank! :allright:

Grüße ... Peter
Hygge
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: Größe einer herunterzuladenden Datei ermitteln

Beitrag von GPI »

Wichtig Content-Length ist optional, das muss nicht vorhanden sein. Das musst du unbedingt abfangen, sonst hast du ein Durch-Null-Fehler
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Größe einer herunterzuladenden Datei ermitteln

Beitrag von Kiffi »

GPI hat geschrieben:Wichtig Content-Length ist optional, das muss nicht vorhanden sein. Das musst du unbedingt abfangen, sonst hast du ein Durch-Null-Fehler
ok, gut zu wissen. Danke für den Tipp!
Hygge
DarkDragon
Beiträge: 6267
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: Größe einer herunterzuladenden Datei ermitteln

Beitrag von DarkDragon »

GPI hat geschrieben:Wichtig Content-Length ist optional, das muss nicht vorhanden sein. Das musst du unbedingt abfangen, sonst hast du ein Durch-Null-Fehler
Genau, und viele Download Werkzeuge zeigen in dem Fall einen Marquee Progressbar an und wieviel bislang runtergeladen wurde.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Antworten