Filesize von grossen Dateien ermitteln
Übersicht

![]() |
ozzi789Betreff: Filesize von grossen Dateien ermitteln |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Man kann mit String-Zahlen arbeiten, dann muss man sich aber alle Operationen darauf selbst schreiben. | ||
Starfare: Worklog, Website (download) |
![]() |
ozzi789 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group