Auf wiederholtes "Drängen" ( ;-) von RaBa ( http://www.page-online.de/page/forum/viewthread/2109 ) habe ich mich endlich näher mit der rekursiven Technik befasst. "Rekursiv" bedeutet, dass eine Subroutine (oder Handler) wiederholt aus einer Schleife aufgerufen wird, welche sich in derselben Subroutine befindet.
Dies ist ziemlich heikel, weil sich leicht ein Überlaufen des Speichers ergeben kann. Aber ich habe zufälligerweise ein Skelett gefunden, welches ich beim Namen-Säuberungs-Droplet erfolgreich einsetzen konnte.
Das Muster-Script benutzt den 'info for'-Befehl, um herauszufinden, ob das aktuelle Objekt eine Datei oder ein Ordner ist. Das Resultat von 'info for' ist eine Liste, welche allerlei Wissenwertes über das Objekt enthält. Unter anderem den Namen, das Modifikationsdatum und die Anzahl Bytes. Aus diesem Grunde sollte man
'info for' vermeiden, wenn ein Ordner anvisiert ist. Je nach Anzahl und Schwere der Dateien, welche sich im Ordner befinden, kann es dauern, bis alle Bytes zusammengezählt sind.
Diese Bremse kann vermieden werden, indem nur der Pfad im Textformat (nicht als 'alias') angeschaut wird. Wenn dieser mit einem Doppelpunkt endet, dann ist das Objekt ein Ordner, sonst ist es eine Datei.
Nachstehend ein kommentiertes Skelett. Achtung: so wie es hier steht, führt das Script nichts aus. Es soll nur den Ablauf darstellen. Wer sich ein funktionierendes Script ansehen möchte, kann bei mir das ebenfalls kommentierte Namen-Säuberungs-Droplet verlangen.
---
-- einen Dialog zeigen, falls der Anwender einen Doppelklick auf das Droplet macht
on run
display dialog "Dateien und Ordner auf dem Icon
dieses Droplets deponieren." buttons "OK" default button 1 with icon 0
end run
-- der 'open handler', welcher auf das Fallenlassen von Objekten reagiert
on open allObjects
-- Wiederholschleife, welche alle gedroppten Objekte zum Handler 'processObject' schickt
repeat with aObject in allObjects
processObject(aObject)
end repeat
end open
-- im folgenden Handler wird festgestellt, ob das Objekt ein Ordner oder eine Datei ist.
-- Bei Ordnern wird eine Liste des Inhalts erstellt und die Elemente rekursiv behandelt (d.h. zum aktuellen Handler geschickt)
-- Dateien werden zum Handler 'processFile' gesandt
on processObject(aObject)
-- die Variable 'aFolder' wird auf 'nicht wahr' gesetzt
set aFolder to false
-- wenn der Pfad mit einem Doppelpunkt endet, wird die Variable 'aFolder' auf 'wahr' gesetzt
if (aObject as string) ends with ":" then
set aFolder to true
end if
-- der Test stellt den Wert der Variable fest und die entsprechende Aktion wird ausgelöst
if aFolder is true then
-- die Liste der Objekte wird erstellt (ohne unsichtbare Dateien)
set contentsList to list folder aObject without invisibles
-- dies ist das rekursive Teil: die Wiederholschleife schickt alle Objekte zum Handler, in welchem sie sich selbst befindet
repeat with anItem in contentsList
set objPath to ((aObject as string) & anItem)
processObject(objPath as alias)
end repeat
-- falls der Ordner untersucht werden muss: den Pfad zum Handler 'processFolder' schicken
processFolder(aObject as string)
-- wenn das Objekt eine Datei ist, dann wird der Pfad dem Handler 'processFile' übergeben
else
processFile(aObject as string)
end if
end processObject
-- in diesem Handler wird die Datei behandelt
on processFile(aFile)
-- entsprechende Befehle hier einfügen
end processFile
-- in diesem Handler wird der Ordner behandelt
on processFolder(aFolder)
-- entsprechende Befehle hier einfügen
end processFolder
---
Hans Haesler <hsa@ringier.ch>