Choppe
Occasional Observer

Rekursive Ausgabe von Ordnern mit fs-access Api

Hallo zusammen,

ich arbeite mich gerade ein wenig in die API ein und wollte mir jetzt alle Medienunterordner eines bestimmten Hauptordners ausgeben lassen:

Codeschnipsel:

MediaFolder folder = (MediaFolder) mediaStore.getStoreElement(38965);

         Listable<StoreElement> children = folder.getChildren();

         for(StoreElement mediaElement: children) {

             if (mediaElement instanceof MediaFolder)

             {

                 System.out.println(mediaElement.getName());

             }

         }

Das funktioniert auch prinzipiell gut, allerdings bekomme ich nur die 1. Ebenene angezeigt, es gibt aber bis zu 5 Ebenen nach unten.

Jemand eine Idee, was an dem Code nicht passt?

Danke und viele Grüße

Christian

0 Kudos
2 Replies
Radigewski
Occasional Collector

folder.getChildren(); gibt die Kinder des einen Folders zurück. Um auch die Enkel zu bekommen musst Du anschließend über die Kinder iterieren bzw. rekursuv alle alle Kinder den ganzen Baum.

0 Kudos
mbergmann
Crownpeak employee

Hallo Christian,

es gibt mehrere getChildren()-Methoden. Für Deinen Fall dürfte getChildren(Class<T> type, boolean recurse) die passende sein.

Gerade wenn man rekursiv alle Objekte eines bestimmten Typs braucht ist das sehr praktisch.

Außerdem sparst Du Dir den Cast, da direkt ein Listable<T> zurückgegeben wird.

Wichtig ist hier allerdings, dass man auf dem Ergebnis (Listable<T>) am besten nur iteriert. Hier das toList() aufzurufen lädt alle entsprechenden Elemente in den Speicher was je nach Startpunkt und Tiefe (also letztlich je nach Anzahl der gelieferten Objekte) sehr ungünstigen Einfluss auf die Performance haben kann.

Da Du Dich gerade in die API einarbeitest noch ein Tipp:

Schöner ist es, sich Elemente vom entsprechenden StoreElementAgent liefern zu lassen (s.u.).

Dein Code könnte also insgesamt so aussehen:

StoreElementAgent sea = context.requireSpecialist(StoreElementAgent.TYPE);

MediaFolder folder = (MediaFolder) sea.loadStoreElement("uid_des_folders", MediaFolder.UID_TYPE, false);

for (MediaFolder mediaElement : folder.getChildren(MediaFolder.class, true)) {

     System.out.println(mediaElement.getName());

}

Viele Grüße

Michael

0 Kudos