Ordnergröße mit DirectoryEntrySize() ergibt immer nur 0

Anfängerfragen zum Programmieren mit PureBasic.
OlderCoder
Beiträge: 134
Registriert: 18.03.2013 12:30
Wohnort: Bayerland
Kontaktdaten:

Re: Ordnergröße mit DirectoryEntrySize() ergibt immer nur 0

Beitrag 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.
Axolotl
Beiträge: 266
Registriert: 31.12.2008 16:34

Re: Ordnergröße mit DirectoryEntrySize() ergibt immer nur 0

Beitrag 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, ",", ".") 
Using PureBasic latest stable version and current alpha/beta (x64) on Windows 11 Home
Axolotl
Beiträge: 266
Registriert: 31.12.2008 16:34

Re: Ordnergröße mit DirectoryEntrySize() ergibt immer nur 0

Beitrag 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 
Using PureBasic latest stable version and current alpha/beta (x64) on Windows 11 Home
Benutzeravatar
HeX0R
Beiträge: 3040
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: Ordnergröße mit DirectoryEntrySize() ergibt immer nur 0

Beitrag 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 :D ("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)
Antworten