Hi nochmal.
Ich versuche gerade ein listview mit Dateinamen zu füllen, das klappt mit dos_scandir auch ganz gut. Nur würde ich die Suche gerne Recursive machen, also inkl. den Dateien in Untergeordneten Schubladen. Scandir scheint das aber nicht zu unterstützen(?), gibt es dafür eine andere/bessere Methode oder muss ich die recursive suche mithilfe von dos_scandir selber machen?
Hier ist mein Aktueller versuch. DH0 wird richtig ausgelesen, wenn er beginnt die Schubladen zu Scannen bleibt er aber in einer endlosschleife. Es beginnt in 'c' und bleibt dann dort stecken.
Laut einem älteren BB guide sollten functions sich selbst aufrufen können, insofern übersehe ich wohl etwas. Jemand eine Idee wo der Haken ist?
EDIT: das ; im in den 'If item > ""' Zeilen wird beim posten eingefügt, das ist im original code natürlich nicht vorhanden.
[ab3]Function icScanDir {icPath2.s}
SHARED *engine
*EnvList.tuiListView = (.tuiListView)ntui_GetObjectByID{*engine,"LVenv"} ; finde ListView
flags.l = (#dos_scan_files|#dos_scan_sorted)
Repeat
item.s = dos_ScanDir{icPath2,"(#?.info)",flags}
If item > ""
NPrint item
ntui_AddListItem{*EnvList,-1,item,0,1234,0}
EndIf
Until item = ""
Function Return 0
End Function
Function icFindDir {icPath.s}
icScanDir {icPath}
NPrint icPath
flags.l = (#dos_scan_dirs|#dos_scan_sorted)
Repeat
item.s = dos_ScanDir{icPath,"",flags}
If item > ""
NPrint item
icFindDir {item}
EndIf
Until item = ""
Function Return 0
End Function
; Aufgerufen wird das ganze mit:
icFindDir {dh0:}[/ab3]
BTW: Mit den NPrint hab ich die schleifen kontrolliert. Aus irgendeinem Grund finded AB meine reqtools.lib nicht und lässt mich den debugger nicht benutzen. Ich hab aber auch noch nicht nachgeschaut woran das liegen könnte.
Oh ha, den Thread hatte ich sogar gelesen. Ich hatte nur vergessen das es da auch um untergeordnete Schubladen ging. :oops:
Ich hab das auch erstmal sein lassen, gibt noch genug anderes das ich im Moment noch Probieren/Testen möchte. Obwohl ich noch versuchen wollte die Ordnerpfade in einer Liste zu speichern. Also mit dem rootverzeichnis in der liste anfangen, die erste Schubladen nach untergeordneten durchsuchen und an die Liste anfügen. usw usw, wenn ich es richtig verstanden habe muss ich Listen aber erst mit einer festen größe Dimensionieren, das scheint mir ungünstig zu sein. Zusätzlich hätte man auch keine anständige Sortierung der Verzeichnisse, man müßte die Pfade, je nach Anwendung, erst wieder analysieren, rausuchen und/oder umsortieren.
Du kannst schon im Listview navigieren wie du willst, auch wenn die Unterverzeichnisse nicht gleich sichtbar sind. Du brauchst eben nur noch einen Parentbutton der dich dann wieder eine Ebene höher bringt.
So mach ich das in Copacabana auch...Oder Thilo in AIDE...
Du kannst Listen auch dynamisch anlegen
Dynamische Listen find ich gut. Da merkt man das ich für diesen kleinkram in einem alten BB2 Guide stöbere

Ein Parent button ist in meinem Fall leider nicht brauchbar. Ich hätte gerne eine Liste mit allen .Info files die auf der Systempartition vorhanden sind.
Ich wollte ein Programm schreiben mit dem ich ein Icontheme speichern kann. Erst eine Liste aller info's sammeln, Icons tauschen und aus der Liste entfernen. Wenn die Liste leer ist alle Info's per lha speichern. Das wäre ein schönes kleines Programm um mich an die Sprache zu gewöhnen. Da ist viel kleinkram in so einem Programm, z.B. beim anwenden des Themes prüfen ob das jeweilige Icon existiert usw. Das erste Projekt sollte ja auch kein zu großes sein. :mrgreen:
scan_Dir verwendet eine Global liste, deshalb kann man es nicht rekursiv aufrufen. Sonst bräuchte die Funktion einen "Handle". Sorry wenn die Docu das nicht erwähnt.
Hier ein Beispiel Code wie du das machen kannst.
[ab3]optimize 5
XINCLUDE "dos.include.ab3"
Statement scan{path.s}
lock.l = Lock_(&path.s,#ACCESS_READ)
If lock=0 Then Statement Return
*fib.FileInfoBlock = AllocDosObject_(#DOS_FIB,#TAG_DONE)
If *fib=0 Then Statement Return
If Examine_ (lock,*fib)
While ExNext_(lock,*fib)
filename.s = dos_AddPart{path.s,Peek.s(&*fib\fib_FileName)}
If *fib\fib_DirEntryType<0
NPrint "do something with ",filename.s
Else
scan{filename.s}
End If
Wend
End If
UnLock_ lock
FreeDosObject_ #DOS_FIB,*fib
End Statement
scan{"Sys:"}
End[/ab3]
Code ohne Formatierungsfehler:
Code:
optimize 5
XINCLUDE "dos.include.ab3"
Statement scan{path.s}
lock.l = Lock_(&path.s,#ACCESS_READ)
If lock=0 Then Statement Return
*fib.FileInfoBlock = AllocDosObject_(#DOS_FIB,#TAG_DONE)
If *fib=0 Then Statement Return
If Examine_ (lock,*fib)
While ExNext_(lock,*fib)
filename.s = dos_AddPart{path.s,Peek.s(&*fib\fib_FileName)}
If *fib\fib_DirEntryType<0
NPrint "do something with ",filename.s
Else
scan{filename.s}
End If
Wend
End If
UnLock_ lock
FreeDosObject_ #DOS_FIB,*fib
End Statement
scan{"Sys:"}
End
dos_Scandir kann das nicht. Das mußt du dir selber bauen.
Du solltest auch eher die Hilfe und Docs anschauen die Ab3 mitbringt, da hat sich viel geändert.
Uiiii alles Nachteulen hier
Der Wanderer war schneller beim Antworten, und auch gleich mit einer Lösung...

Ich bin keine Nachteule (mehr). Ich wohne in Sillicon Valley, da ist es gerade 4 Uhr nachmittags.