Seite 2 von 2
Re: Ordnergröße mit DirectoryEntrySize() ergibt immer nur 0
Verfasst: 10.04.2025 11:33
von OlderCoder
Gibt es eigentlich noch eine passendere Alternative zu VAL, wenn es darum geht, einen String in eine Zahl zu wandeln?
Bei cmd.exe wird die Speichergröße mit Tausender-Trennpunkten angegeben, und VAL nimmt nur die ersten Ziffern vor dem ersten Punkt.
Ich kann es natürlich auch zerstückeln und wieder zusammensetzen, aber schön ist das nicht.
Edit: Kein Thema mehr, ReplaceString(zeichen$,".","") wirft die Punkte raus.
Re: Ordnergröße mit DirectoryEntrySize() ergibt immer nur 0
Verfasst: 10.04.2025 15:12
von Axolotl
Ja, gibt es.
Code: Alles auswählen
Define Size = 1234
Debug FormatNumber(Size, 0, ",", ".")
Define Value.d = 1234567.89
Debug FormatNumber(Value, 2, ",", ".")
Re: Ordnergröße mit DirectoryEntrySize() ergibt immer nur 0
Verfasst: 10.04.2025 15:36
von Axolotl
Ich habe gerade mal ein bischen auf/in meiner Festplatte gestöbert, vielleicht hilft es dir ja ...
BTW: Ein Code Schnipsel ist von NicTheQuick. (Aber das siehste ja selbst.)
Code: Alles auswählen
EnableExplicit
Procedure.q CountFiles(Directory.s, bWithFolders = #False, NDir=0)
Protected result.q, entry.s
Directory = RTrim(Directory, #PS$)
If ExamineDirectory(NDir, Directory, "*.*") ; use this pattern to compute all files and folders
If NDir = 0
result = 0
EndIf
While NextDirectoryEntry(NDir)
If DirectoryEntryType(NDir) = #PB_DirectoryEntry_File
result + DirectoryEntrySize(NDir)
Else
entry = DirectoryEntryName(NDir)
If bWithFolders And entry <> "." And entry <> ".."
result + CountFiles(Directory + #PS$ + entry, bWithFolders, NDir + 1)
EndIf
EndIf
Wend
FinishDirectory(NDir)
EndIf
ProcedureReturn result
EndProcedure
Procedure.s SizeToStr(Size.q, bBinary = #True) ; returns i.e. '900 B' or '2 kiB' etc. | INFO: KB or KiB .. Binary = #TRUE => 1024
Protected idx, divisor, subtotal.d
subtotal = Size ; change data type of Size to subtotal
divisor = 1000 + 24 * Bool(bBinary) ; depends on KB or KiB .. strange discussion on SI stuff
If Size < divisor
ProcedureReturn FormatNumber(Size, 0, ",", ".") + " B" ; bytes
EndIf
While subtotal >= divisor
subtotal / divisor
idx + 1
Wend
ProcedureReturn FormatNumber(subtotal, 2, ",", ".") + " " + Mid("kMGTPE", idx, 1) + Left("i", Bool(bBinary)) + "B" ; yes!!
EndProcedure
;
; Original Code looked like this.....
;
; ;Procedure$ Digit(Value.q, xBinary = #True)
; ; NicTheQuick
; ; http://forums.purebasic.com/german/viewtopic.php?f=8&t=28640&sid=a8432079969094fac027e2746f3b429e&start=10
; Static Shorts$ = "kMGTPE"
; Protected idx = 0, result.d = Value ;
;
; If Value < 1024 ; easy way out ...
; ProcedureReturn StrU(Value, #PB_Quad) + " B" ; bytes
; EndIf
;
; While result >= 1024
; result / (1000 + 24 * Bool(xBinary))
; idx + 1 ; increment for präfix
; Wend
; ProcedureReturn StrD(result, 2) + " " + Mid(Shorts$, idx, 1) + Left("i", Bool(xBinary)) + "B" ;
; EndProcedure
CompilerIf #PB_Compiler_IsMainFile
Define fsize.q
fsize = CountFiles("C:\Temp\", #True)
Debug FormatNumber(fsize, 0, ",", ".") + " Bytes"
Debug SizeToStr(fsize) + "ytes"
Debug SizeToStr(fsize, #False) + "ytes"
CompilerEndIf
Re: Ordnergröße mit DirectoryEntrySize() ergibt immer nur 0
Verfasst: 10.04.2025 16:03
von HeX0R
OlderCoder hat geschrieben: 10.04.2025 09:47
Ah ok. dir kenn ich. Aber warum fällt dann /c weg? (Ich komm mir vor wie ein kleines Kind

("und waruuuum?.....")
Eigentlich könnte man meinen, dass man dasselbe im cmd.exe-Fenster eingeben kann, was auch PureBasic an cmd.exe schickt.
Wenn Du cmd.exe öffnest, bist Du in der Eingabeaufforderung und kannst Befehle per Tastatur eingeben.
Möchtest Du aber der cmd.exe schon einen Befehl mit auf den Weg geben, musst Du cmd.exe /C nutzen.
Öffne mal eine Eingabeaufforderung und gib da cmd.exe ein, da passiert nix (außer, dass Du eine zweite geöffnet hast ohne es zu merken).
Gibst Du aber dort cmd.exe /C dir ein, siehst Du den Unterschied (oder eben nur Dir)