Filesize von grossen Dateien ermitteln

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

ozzi789

Betreff: Filesize von grossen Dateien ermitteln

BeitragDi, Feb 22, 2011 21:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Da Filesize (bei B+ zumindest) nur bis 2GB funktioniert frage ich mal ob da jemand eine Lösung hat.
https://www.blitzforum.de/foru...t=filesize funktioniert bei mir nicht, ich bekomme lediglich RAR->! und BB freezed.


Ideas?

Grüsse ozzi
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5

Hummelpups

BeitragMi, Feb 23, 2011 1:02
Antworten mit Zitat
Benutzer-Profile anzeigen
geht bei BMax.

Code: [AUSKLAPPEN]
Print FileSize("file")+(2^32)


(nur 2^32 addieren wenn ergebnis<0)
blucode - webdesign - Ressource - NetzwerkSim
BlitzBasic 2D - BlitzMax - MaxGUI - Monkey - BlitzPlus

ozzi789

BeitragMi, Feb 23, 2011 14:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Windows sagt 4'417028'096 Byte
B+ sagt mit deinem Trick ~ 4'41703e+009

Als Annäherungswert sicherlich gut, doch ich müsste die genaue Grösse haben da ich mit Writebytes arbeite.
Evt kann ich da was tricksen.

Gibts irgend nen Hack, Int64 zu verwenden?

Thx,
ozzi
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5

Pummelie

BeitragMi, Feb 23, 2011 16:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Da BB funktionen auch nur einen int32 wert annehmen, wird dir da ein größer int64 nix bringen.
Wenn möglich teile die zu verarbeitenden Daten auf, wenn dir das nichts hilft, hast du die Grenzen von BB erreicht, Zeit auf eine andere Sprache um zu steigen...
It's done when it's done.

ZaP

BeitragMi, Feb 23, 2011 19:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Man kann mit String-Zahlen arbeiten, dann muss man sich aber alle Operationen darauf selbst schreiben.
Starfare: Worklog, Website (download)

ozzi789

BeitragMi, Feb 23, 2011 20:10
Antworten mit Zitat
Benutzer-Profile anzeigen
ZaP daran habe ich auch gedacht.
Ich bastel mal da rum.

Aber ja ich denk ich werd ganz auf C umsteigen, und BB wirklich nur noch für Spielereien brauchen.

Grüsse
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5

ToeB

BeitragMi, Feb 23, 2011 21:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Oder sonst mit Banks ? Den ich denke die api Funktion wird ja über ne Bank zurückgegeben ?

Ich nehm mir das grade mal an und versuche grad mal ein Bank-Rechner zu schreiben, mit dem man Variablen Typen über banken diffinieren kann ...

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

Hummelpups

BeitragMi, Feb 23, 2011 21:25
Antworten mit Zitat
Benutzer-Profile anzeigen
oder, wenns nur das ist, programmiert ihn eben einer ne Exe mit BMax die mit parametern aufgerufen wird und
die filesize zurück gibts, das wäre doch der weg des geringsten Widerstandes?
blucode - webdesign - Ressource - NetzwerkSim
BlitzBasic 2D - BlitzMax - MaxGUI - Monkey - BlitzPlus

ozzi789

BeitragDo, Feb 24, 2011 10:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich habe eine standalone exe namens tcpsend.
Sehr simpel da sie nur einen Stream öffnet und Daten versendet.
tcprecive müsste dann auch in BMax geschrieben werden.

Das Mainprogramm gibt sowieso nur die gerundete Grösse an da kann ich den ^32 Trick anwenden (4'2XXXXXXX.. KB ~ 4.2 GB Wink )


Wenn die untenfolgenden Codes jemand in BMax/BB schreiben könnte mit diesen Tricks sodass dies auch funktioniert wäre ich unglaublich dankbar und verdient meine Lebenslange hochachtung.



TCPRecive
Code: [AUSKLAPPEN]

;Commandline Parameter splitten
cmdline$=CommandLine()
break=Instr(cmdline$,"|")
break2=Instr(cmdline$,"|",break+1)

name$= Mid(cmdline$,2,break-2)
port= Mid(cmdline$,break+1,break2)
ip$  = Mid(cmdline$,break2+1)



;GUI initialisieren
Windowmain=CreateWindow("Downloading "+name$,600,0,200,100,Desktop(),1)
progbar=CreateProgBar(0,0,200,20,Windowmain)

;Stream mit Commandline Parametern öffnen
stream=OpenTCPStream(ip$,port)
file=WriteFile(name$)


;Die grösse der Empfangenen Datei aus dem Stream lesen (von tcpsend.exe)
filesz=ReadLine(stream)

;Bank erstellen für spätere Verwendung von Write/Readbytes
bnk = CreateBank(4096)

;Contentlenght=was wir vorher ermittelt haben
conlen=filesz

;CRC32 Checksumme auslesen (von tcpsend.exe)
crc32=ReadLine(stream)

;Wenn es keine Ungültige ist
If crc32<>123123123
   ;Wenn schon ein crc32 File da war löschen
   DeleteFile(name$+".crc32")
   Delay(1)
   crcfile=WriteFile(name$+".crc32") ;Neues anlegen
   WriteLine crcfile,crc32           ;Checksumme reinschreiben
   SetFileAttribut(name$+".crc32",2) ;File Attribut "Hidden" setzen
EndIf
CloseFile(crcfile)

;Infos über den Transfer..
remaining=CreateLabel("Bytes remaining: "+(conlen-pos)+Chr$(13),0,40,200,20,Windowmain)

;Start Zeit speichern
start=MilliSecs()

While Not Eof(stream)
   counter=counter+1
         avail = conlen - pos  ; Was noch kommt an bytes ist die Gesamtlänge minus was wir schon bekommen haben
         If avail > 4096 Then  ; Grosses Pack
            ReadBytes bnk, stream, 0, 4096
            WriteBytes bnk, file, 0, 4096
            pos = pos + 4096
         Else                 ; Letzes Package
            ReadBytes bnk, stream, 0, avail
            WriteBytes bnk, file, 0, avail
            pos=pos+avail
            Exit
         EndIf

   ;Speed Berechnung
   If MilliSecs()>time+1000  ;jede Sekunde
      time=MilliSecs()
      tpos=pos-spos          ;Alles was diese Sekunde versandt wurde an Bytes zusammenzählen
      spos=pos
      tpos=tpos/1024/1024    ; In MB/S umrechnen
   EndIf


   If counter=200             ;Bei 200 durchgängen
      counter=0
      SetGadgetText(remaining,"Bytes remaining: "+(conlen-pos)+"  "+tpos+" MB/s")  ;GUI Updaten
      If PeekEvent() Then a=WaitEvent()  ; Sodass das die EXE noch mit Windows kommuniziert und keine "Reagiert nicht mehr" Meldung kommt
      If a=$803 ; Wenn es ein "X" schliessen war dann tschüss
         CloseFile(file)
         CloseTCPStream(stream)
         End
      EndIf
      prog#=(100/(Float(conlen)/Float(pos)))/100 ;Progbar wert berechnen
      UpdateProgBar(progbar,prog#)
   EndIf
Wend


endt=MilliSecs()
tot=endt-start
tot=tot/1000 ;Gesamtzeit ausrechnen

If crc32<>123123123 ;Falls es checksumme gab die uns vom server mitgeteilt wurde
   gcrc=ExecFile("gcrc32.exe "+name$) ;gcrc32.exe aufrufen welche die vom server mit einer aus dem downgeloadeten file erstellte crc32 vergleicht
EndIf

Notify "Download complete ,"+tot+" s"+"  "+(endt-start)+" gcrc:"+gcrc ;Alles gut und alle sind happy + infos


TCPSend
Code: [AUSKLAPPEN]
AppTitle "tcpsend.exe"


;Commandline Parameter splitten
cmdline$=CommandLine()
break=Instr(cmdline$,"|")
break2=Instr(cmdline$,"|",break+1)
break3=Instr(cmdline$,"|",break2+1)

path$= Mid(cmdline$,2,break-2)
port= Mid(cmdline$,break+1,break2)
ip$  = Mid(cmdline$,break2+1,break3)
crc32$  = Mid(cmdline$,break3+1)


;Verbindung aufbauen
srv=CreateTCPServer(port)
If srv=0 RuntimeError("TCP Server could not be started!")

;Zusendendes File öffnen (pfad aus Commandline())
stream=OpenFile(path$)


If stream=0 RuntimeError("File could not be opend - "+path$)

;Startzeit
st=MilliSecs()

;Auf Client warten
While client=0
   newclient= AcceptTCPStream(srv)
   If newclient<>0
      client=newclient
   EndIf
   If client=0 And MilliSecs()>st+500 RuntimeError("Client tcprecive not responding") ; Wenn der Client zu lange hatte dies mitteilen und abbrechen
Wend


; Filesize ermitteln |Funktioniert nur bei > 2GB !
conlen=FileSize(path$)
WriteLine client,conlen ;Die Grösse des Files an tcprecive übergeben
WriteLine client,crc32$ ;Die vom Server ermittelte crc32 checksumme des Files übergeben (tcprecive)

;Bank erstellen für Write/Readbytes
bnk = CreateBank(4096)

;Solange wir noch Daten haben
While Not Eof(stream)


            avail = conlen - pos ;Was wir noch senden müssen = gesamtlänge minus was wir schon gesendet haben
            If avail > 4096 Then
               ReadBytes bnk, stream, 0, 4096
               WriteBytes bnk, client, 0, 4096
               pos = pos + 4096 -53
            Else
               ReadBytes bnk, stream, 0, avail
               WriteBytes bnk, client, 0, avail
               Exit
            EndIf
Wend
 

Delay(500)


;Tschüss
CloseTCPStream(newclient)
CloseTCPServer(srv)
CloseFile(stream)
End
      
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group