[GastForen Programmierung/Entwicklung AppleScript Anleitung für ein rekursives Droplet

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Themen
Beiträge
Moderatoren
Letzter Beitrag

Anleitung für ein rekursives Droplet

Hans Haesler
  
Beiträge gesamt: 5826

11. Jan 2004, 21:51
Beitrag # 1 von 1
Bewertung:
(581 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
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>
X