Anyone know how I can convert this code to NOT use a global variable to hold the directory size? Because my app needs to call this routine multiple times now from different threads, and the var is getting incorrectly updated even though my app is thread-safe.
Global foldersize.q ; Don't want to rely on this being global.
Procedure.q FolderSizeRoutine(dir$)
dir=ExamineDirectory(#PB_Any,dir$,"")
If dir
While NextDirectoryEntry(dir)
If DirectoryEntryType(dir)=#PB_DirectoryEntry_File
foldersize+DirectoryEntrySize(dir)
Continue
ElseIf Not DirectoryEntryName(dir)="." And Not DirectoryEntryName(dir)=".."
FolderSizeRoutine(dir$+DirectoryEntryName(dir)+"\")
Continue
EndIf
Wend
FinishDirectory(dir)
EndIf
ProcedureReturn foldersize
EndProcedure
Procedure.q FolderSize(dir$)
If Right(dir$,1)<>"\"
dir$+"\"
EndIf
foldersize=0
FolderSizeRoutine(dir$)
ProcedureReturn foldersize
EndProcedure
Debug FolderSize("C:\Windows\System32\") ; Example of current non-thread use.
Last edited by BarryG on Sun Jun 09, 2024 8:27 am, edited 1 time in total.
EnableExplicit
Procedure.q FolderSize(dir$)
Protected size.q, dir
dir=ExamineDirectory(#PB_Any,dir$,"")
If dir
While NextDirectoryEntry(dir)
If DirectoryEntryType(dir)=#PB_DirectoryEntry_File
size+DirectoryEntrySize(dir)
ElseIf Not DirectoryEntryName(dir)="." And Not DirectoryEntryName(dir)=".."
size+FolderSize(dir$+"\"+DirectoryEntryName(dir)+"\")
EndIf
Wend
FinishDirectory(dir)
EndIf
ProcedureReturn size
EndProcedure
Procedure threadTest( *folder )
Debug FormatNumber(FolderSize(PeekS(*folder)),0) + " bytes in "+PeekS(*folder)
EndProcedure
Define h1=CreateThread(@threadTest(),@"c:\windows\system32")
WaitThread(h1)
Last edited by BarryG on Sun Jun 09, 2024 8:29 am, edited 3 times in total.