Es tut sich was:
Im englischen Forum wurde ich darauf aufmerksam gemacht, dass es auch so geht:
Änderungen und Vorteile:
- Kompatibel schon ab PB 4.00 statt 4.01
- schneller als der obige Code
- Angaben <0 geben auch 0 zurück (vorher -1)
- keine Nutzung boolescher Ausdrücke mehr (diese werden offiziell sowieso nicht unterstützt)
Code: Alles auswählen
Procedure.s byterechner(byte.q, NbDecimals.l=0)
If byte < 1024
If byte < 0
ProcedureReturn "0 Byte"
EndIf
ProcedureReturn Str(byte)+" Byte"
ElseIf byte >= 1<<60
ProcedureReturn StrD(byte/1<<60, NbDecimals)+" EB"
ElseIf byte >= 1<<50
ProcedureReturn StrD(byte/1<<50, NbDecimals)+" PB"
ElseIf byte >= 1<<40
ProcedureReturn StrD(byte/1<<40, NbDecimals)+" TB"
ElseIf byte >= 1<<30
ProcedureReturn StrD(byte/1<<30, NbDecimals)+" GB"
ElseIf byte >= 1<<20
ProcedureReturn StrD(byte/1<<20, NbDecimals)+" MB"
Else
ProcedureReturn StrD(byte/1024, NbDecimals)+" KB"
EndIf
EndProcedure
Debug byterechner(-4096) ; ungültige Angabe wird zu "0 Byte"
Debug byterechner(0) ; Eine Null-Byte große Datei bleibt auch 0 Byte groß
Debug byterechner(27101988) ; Bisherige Angaben bleiben ok
Hinweis: Angaben <0 werden zu "0 Byte", denn u. U. gibt
FileSize() negative Werte zurück, die dann durch den Byterechner ebenfalls negativ werden. Es erscheint mir sinnvoller, dann lieber "0 Byte" zurückzugeben. (Das kann aber jeder nach Wunsch ändern!)
Frage: Ich habe diesen Code auch mal mit ausgerechneten Werten statt den 'geshifteten' Ausdrücken laufen lassen. Der 'geschiftete' ist jedoch geringfügig schneller, warum?