Ich habe ein seltsames Problem mit folgendem Code:
Das Programm soll alle Ordner eines bestimmten Verzeichnisses auslesen und nach Größe sortieren (da Windows das nicht von alleine schafft

Das funktioniert eigentlich -erstaunlich- gut, aber bei einigen anscheinend willkürlichen Einträgen wird statt der Größe nur der negative Maximalwert einer Long-Variable (-2147483648) angezeigt, was zusätzlich seltsam anmutet, da ich für die Größe Floats verwende.
Als zweites Problem erzeugt das SortStructuredList vor der Ausgabe einen Invalid Memory Access und ich komme nicht dahinter warum!!
Der Code ist sehr einfach gestrickt und eigentlich nur schnell zusammengebastelt (sollte ja nicht öffentlich werden

Code: Alles auswählen
;Directory Size
pfad$=PathRequester("Wählen Sie einen Ordner:","")
If pfad$="" : End: EndIf
Enumeration
#Window
#List
#Label
#Pfad
EndEnumeration
Structure direct
name.s
size.f
EndStructure
NewList dir.direct()
Global dir.l
Procedure.s groesse(gross.f); - Wandelt eine Größe von KBytes in einen String mit KB, MB und GB um (Rundung auf 2 Stellen)
If gross<0
ende$=Str(gross*1024)+" Byte"
ElseIf gross<1024
ende$=StrF(gross,2)+" KB"
ElseIf gross<1048576
ende$=StrF(gross/1024,2)+" MB"
Else
ende$=StrF(gross/1048576,2)+" GB"
EndIf
ProcedureReturn ende$
EndProcedure
Procedure.f DirectorySize(pfad$); - Gibt die Größe eines Verzeichnisses mit Unterverzeichnissen in KB zurück
dir+1
pdir=dir
ExamineDirectory(dir,pfad$,"")
Repeat
If size.f=-2147483648
CallDebugger ;<<=== Stoppt bei dem Fehler
EndIf
Select NextDirectoryEntry()
Case 1
size.f+DirectoryEntrySize()/1024
Case 2
If DirectoryEntryName()<>"." And DirectoryEntryName()<>".."
path$=pfad$+DirectoryEntryName()+"\"
size.f+DirectorySize(path$)
;Debug path$
UseDirectory(pdir)
EndIf
Case 0
ProcedureReturn size
EndSelect
ForEver
EndProcedure
; Analyse des angegebenen Verzeichnisses
ExamineDirectory(dir,pfad$,"")
Repeat
Select NextDirectoryEntry()
Case 2
AddElement(dir())
dir()\name=DirectoryEntryName()
dir()\size=DirectorySize(pfad$+dir()\name+"\")
UseDirectory(0)
Case 0
quit=1
EndSelect
Until quit=1
; Fenster öffnen für Ausgabe
If OpenWindow(#Window, 355, 82, 600, 780, #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar , "DirectorySize")
If CreateGadgetList(WindowID())
;-
ListIconGadget(#List, 0, 25, 600, 755, "Name", 450, #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection)
AddGadgetColumn(#List, 1, "Größe", 146)
TextGadget(#Label, 10, 5, 30, 15, "Pfad:")
StringGadget(#Pfad, 40, 5, 560, 19, "", #PB_String_ReadOnly | #PB_String_BorderLess)
EndIf
EndIf
; Ausgabe
SortStructuredList(dir(),1,OffsetOf(direct\size),#PB_Sort_Float) ;<==== INVALID MEMORY ACCESS
ResetList(dir())
For i = 0 To CountList(dir())-1
NextElement(dir())
AddGadgetItem(#List,i,dir()\name)
SetGadgetItemText(#List,i,groesse(dir()\size),1)
Next
SetGadgetText(#Pfad,pfad$)
; Eventschleife :D
Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow
End
lg. Justy