Quad-example for Get Dir-Size Recursive V4

Share your advanced PureBasic knowledge/code with the community.
User avatar
Rings
Moderator
Moderator
Posts: 1435
Joined: Sat Apr 26, 2003 1:11 am

Quad-example for Get Dir-Size Recursive V4

Post by Rings »

Code updated For 5.20+

a small birthday present for you 2
understand the usage of quads and recursive
directoryscans.
i posted this normaly only for the ALPHA-versions, but
now it seems to work perfectly in the betas.

Code: Select all

;
; Directory Scanner , shows bytes of Directorys
;
; (c) 2006 By Siegfried Rings
;
; Purpose: - To evaluate PB4's  quad-support
; and find the biggest waster on my harddisks
;
; I DON'T LIKE 2 COMMENT MY SOURCE !

Enumeration
  #Window_0
  #String_DirectoryName
  #ListIcon_DirectoryGrid
  #Button_DirectoryDown
  #Button_DirectoryScan
  #Button_DirectoryPick
  #CheckBoxGadget_SortFlag
EndEnumeration

Structure MyDirectoryStructure
  Name.s
  Length.q
EndStructure

Global NewList MyDirectory.MyDirectoryStructure()
Global wSize.q
Global Size1.q


Procedure.q GetDirectorySize(d,f.s)
  k=d+1
  sz.q
  If ExamineDirectory(k,f,"*.*")
    While NextDirectoryEntry(k)
      FileType=DirectoryEntryType(k)
      FileName.s = DirectoryEntryName(k)
      If FileType = 2
        If FileName<>"." And FileName<>".."
          SetWindowTitle(#Window_0,"wait... scanning directory " + f+FileName)
          sz=sz+GetDirectorySize(k,f+FileName+"\")
        EndIf
      Else
        sz=sz+FileSize(f+FileName)
      EndIf
    Wend
    FinishDirectory(k)
  EndIf
  ProcedureReturn sz
EndProcedure

Procedure.s FormatNumber(Number.q,Max)
  dummy.s=StrU(Number.q)
  l1=Len(dummy)
  For i=L1 To 1 Step -1
    dummy2.s=Mid(dummy,i,1)+dummy2
    p+1
    If p=3 And I<>1
      dummy2.s ="."+dummy2.s
      p=0
    EndIf
  Next
  dummy2=Right(Space(max)+dummy2,max)
  ProcedureReturn dummy2
EndProcedure

Procedure ShowDirectorySorted()
  SortFlag=GetGadgetState(#CheckBoxGadget_SortFlag)
  If SortFlag =0
    SortStructuredList(MyDirectory(), 2, OffsetOf(MyDirectoryStructure\Name), #PB_String)
  Else
    SortStructuredList(MyDirectory(), 1, OffsetOf(MyDirectoryStructure\Length), #PB_Quad)
  EndIf
  
  ClearGadgetItems(#ListIcon_DirectoryGrid)
  P=1
  ForEach MyDirectory()
    Content.s=MyDirectory()\Name+Chr(10)+FormatNumber(MyDirectory()\length,20)
    AddGadgetItem(#ListIcon_DirectoryGrid,-1, content )
    
  Next
  
  t= CountGadgetItems(#ListIcon_DirectoryGrid) -1
  For I=0 To t
    P+1
    If P=1
      SetGadgetItemColor(#ListIcon_DirectoryGrid,I,#PB_Gadget_BackColor,RGB(250,250,150))
      SetGadgetItemColor(#ListIcon_DirectoryGrid,I,#PB_Gadget_FrontColor,RGB(0,0,0))
    Else
      SetGadgetItemColor(#ListIcon_DirectoryGrid,I,#PB_Gadget_BackColor,RGB(100,100,100))
      SetGadgetItemColor(#ListIcon_DirectoryGrid,I,#PB_Gadget_FrontColor,RGB(200,200,100))
      P=0
    EndIf
  Next
  
  Content.s=".."+ Chr(10)+ "--------------------"
  AddGadgetItem(#ListIcon_DirectoryGrid,-1, content )
  
  Filename.s="..sum of directorys in '"+GetGadgetText(#String_DirectoryName)+"'"
  Content.s=Filename+ Chr(10)+ FormatNumber(wsize,20)
  AddGadgetItem(#ListIcon_DirectoryGrid,-1, content )
  
  I=CountGadgetItems(#ListIcon_DirectoryGrid) -1
  SetGadgetItemColor(#ListIcon_DirectoryGrid,I,#PB_Gadget_BackColor,RGB(250,250,100),1)
  SetGadgetItemColor(#ListIcon_DirectoryGrid,I,#PB_Gadget_FrontColor,RGB(100,100,250),1)
  
  Filename.s="..single files in '"+GetGadgetText(#String_DirectoryName)+"'"
  Content.s=Filename+ Chr(10)+ FormatNumber(size1,20)
  AddGadgetItem(#ListIcon_DirectoryGrid,-1, content )
  
  I=CountGadgetItems(#ListIcon_DirectoryGrid) -1
  SetGadgetItemColor(#ListIcon_DirectoryGrid,I,#PB_Gadget_FrontColor,RGB(250,250,250),1)
  SetGadgetItemColor(#ListIcon_DirectoryGrid,I,#PB_Gadget_BackColor,RGB(100,100,250),1)
  
  
  Content.s=".."+ Chr(10)+ "--------------------"
  AddGadgetItem(#ListIcon_DirectoryGrid,-1, content )
  Filename.s=".. complete size of '" + GetGadgetText(#String_DirectoryName)+"'"
  Content.s=Filename+Chr(10)+FormatNumber(Wsize+size1,20)
  AddGadgetItem(#ListIcon_DirectoryGrid,-1, content )
  I=CountGadgetItems(#ListIcon_DirectoryGrid) -1
  SetGadgetItemColor(#ListIcon_DirectoryGrid,I,#PB_Gadget_BackColor,RGB(250,100,100),1)
  SetGadgetItemColor(#ListIcon_DirectoryGrid,I,#PB_Gadget_FrontColor,RGB(250,250,100),1)
  
  
EndProcedure

Procedure ScanDirectory()
  ClearList( MyDirectory())
  
  StartDirectory.s=GetGadgetText(#String_DirectoryName)
  If Right(StartDirectory,1)<>"\"
    StartDirectory + "\"
    SetGadgetText(#String_DirectoryName,StartDirectory)
  EndIf
  wSize.q=0
  Size1.q=0
  Size.q=0
  SetWindowTitle(#Window_0,"wait... scanning directory " + StartDirectory)
  If ExamineDirectory(0,StartDirectory,"*.*")
    While NextDirectoryEntry(k)
      FileType=DirectoryEntryType(k)
      FileName$ = DirectoryEntryName(k)
      If FileType = 2
        If FileName$<>"." And FileName$<>".."
          size=GetDirectorySize(1,StartDirectory+FileName$+"\")
          If size<>0
            wSize=Wsize+size
            Content.s=FileName$ + Chr(10) + FormatNumber(size,20)
            AddElement(MyDirectory())
            MyDirectory()\Name=FileName$
            MyDirectory()\Length=size
          EndIf
        EndIf
      ElseIf FileType = 1
        size1.q=size1.q+FileSize(StartDirectory+FileName$)
      EndIf
    Wend
    FinishDirectory(k)
    SetWindowTitle(#Window_0,"Ready scanning directory " + StartDirectory)
  EndIf
EndProcedure

hwnd=OpenWindow(#Window_0, 1, 1, 800, 600, "DirectorySize in Bytes per Folder",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
If hwnd
  
  StringGadget(#String_DirectoryName, 0, 0, 510, 20, "c:\")
  ButtonGadget(#Button_DirectoryDown, 515, 0, 20, 20, "..")
  ButtonGadget(#Button_DirectoryPick, 540, 0, 50, 20, "pick")
  
  FontID1 = LoadFont(1, "Courier New", 10)
  ButtonGadget(#Button_DirectoryScan, 595, 0, 50, 20, "Scan")
  CheckBoxGadget(#CheckBoxGadget_SortFlag, 650, 0, 100, 20, "Sort-ABC")
  
  ListIconGadget(#ListIcon_DirectoryGrid, 0, 25, 800, 575, "Name", 610)
  AddGadgetColumn(#ListIcon_DirectoryGrid, 1, "Size", 180)
  SetGadgetFont(#ListIcon_DirectoryGrid, FontID1)
  
  
  
  
  SetGadgetText(#String_DirectoryName,"c:\Winnt\system32") ;init-Directory
  
  Repeat ; Start of the event loop
    Event = WaitWindowEvent() ; This line waits until an event is received from Windows
    WindowID = EventWindow() ; The Window where the event is generated, can be used in the gadget procedures
    GadgetID = EventGadget() ; Is it a gadget event?
    EventType = EventType() ; The event type
    
    If Eventtype=#PB_EventType_LeftDoubleClick
      If gadgetID=#ListIcon_DirectoryGrid
        pos=GetGadgetState(#ListIcon_DirectoryGrid)
        dummy.s=GetGadgetItemText(#ListIcon_DirectoryGrid,pos,0)
        If Left(dummy,2)<>".."
          SetGadgetText(#String_DirectoryName,GetGadgetText(#String_DirectoryName)+dummy)
          ScanDirectory()
          ShowDirectorySorted()
        Else
          dummy=GetGadgetText(#String_DirectoryName)
          If Right(dummy,1)="\"
            dummy=Left(dummy,Len(dummy)-1)
          EndIf
          l =Len(dummy)
          For i=l To 1 Step -1
            If Mid(dummy,i,1)="\"
              dummy=Left(dummy,I-1)
              Break
            EndIf
          Next i
          dummy=dummy + "\"
          SetGadgetText(#String_DirectoryName,dummy)
          ScanDirectory()
          ShowDirectorySorted()
        EndIf
      EndIf 
    EndIf
    
    If EventType=#PB_EventType_LeftClick
      Select GadgetID
          
        Case #Button_DirectoryPick
          SetGadgetText(#String_DirectoryName,PathRequester("get your directory to scan",GetGadgetText(#String_DirectoryName)))
          ScanDirectory()
          ShowDirectorySorted()
          
        Case #Button_DirectoryDown
          
          dummy.s=GetGadgetText(#String_DirectoryName)
          If Right(dummy,1)="\"
            dummy=Left(dummy,Len(dummy)-1)
          EndIf
          l=Len(dummy)
          For i=l To 1 Step -1
            If Mid(dummy,i,1)="\"
              dummy=Left(dummy,I-1)
              Break
            EndIf
          Next i
          dummy=dummy + "\"
          SetGadgetText(#String_DirectoryName,dummy)
          ScanDirectory()
          ShowDirectorySorted()
          
        Case #Button_DirectoryScan
          scandirectory()
          ShowDirectorySorted()
          
        Case #CheckBoxGadget_SortFlag
          state=GetGadgetState(#CheckBoxGadget_SortFlag)
          If state=1
            SetGadgetText(#CheckBoxGadget_SortFlag,"Sort-NR")
          Else
            SetGadgetText(#CheckBoxGadget_SortFlag,"Sort-ABC")
          EndIf
      EndSelect
    EndIf
  Until Event = #PB_Event_CloseWindow ; End of the event loop
EndIf

End
SPAMINATOR NR.1