Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Recursive Suche mit scandir
#1
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?
Zitieren
#2
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.
Zitieren
#3
Hallo,

Jupp, die Frage hatten wir schonmal.

http://www.amiblitz.de/community/viewtopic.php?f=5&t=39
Zitieren
#4
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.
Zitieren
#5
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
Zitieren
#6
Dynamische Listen find ich gut. Da merkt man das ich für diesen kleinkram in einem alten BB2 Guide stöbere Smile
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:
Zitieren
#7
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
Zitieren
#8
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.
Zitieren
#9
Uiiii alles Nachteulen hier Big Grin

Der Wanderer war schneller beim Antworten, und auch gleich mit einer Lösung... Wink
Zitieren
#10
Ich bin keine Nachteule (mehr). Ich wohne in Sillicon Valley, da ist es gerade 4 Uhr nachmittags.
Zitieren


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste