(* digFolder 1.2
Seuraava skripti on esimerkki rekursiosta.
Rekursiolla tarkoitetaan tehtävän toistamista arvoilla, jotka
tehtävä on juuri tuottanut. Muodoltaan se on muuttujan arvoa 
käsittelevä rutiini, joka tarvittaessa aloittaa itsensä alusta 
tuottamillaan arvoilla.

Kansion sisällön listaus on hyvä esimerkki tehtävästä, jossa
tarvitaan rekursiivinen rutiini. Aloittaessa ei tiedetä,
kuinka monta tasoa hakemistopuussa on. Ei siis voida tietää 
etukäteen, kuinka monta toistokertaa tarvitaan jokaisen alikansion
sisällön listaamiseksi.

Tallenna skripti skriptieditorillasi ohjelmaksi. Jos aiot listata
esim. kokonaisia kiintolevyjä, lisää skriptiohjelman muistivarausta
Finderin Näytä Tietoja -komennolla vaikkapa 4000 kilotavua. Muuten ajo 
voi keskeytyä rekursiivisen muuttujan täyttäessä ohjelman muistin.

2000 Tuomas Rosberg <vanhentunut>
Lähdekoodi on ilmaista ja tarkoitettu yleiseen käyttöön (public domain).
Sitä lainattessa kirjoittajan nimi on mainittava.
Koodilla ei ole mitään takuuta, ja sen sisältävää ohjelmaa käyttävät
toimivat omalla vastuullaan.
*)

global directoryList

on run
   set directoryList to {}
   set aFolder to choose folder with prompt "Choose a folder, please. "
   my digFolder(aFolder)
   theResult(directoryList, aFolder)
end run

on digFolder(aFolder)
   set folderList to {}
   tell application "Finder"
      set fileList to every file in aFolder
      repeat with aFile in fileList
         set aFile to aFile as string -- for a more readable result
         set directoryList to directoryList & aFile
      end repeat
      set folderList to folderList & (every folder of aFolder)
      if folderList is not {} then
         repeat with aFolder in folderList
            my digFolder(aFolder) -- the recursion
            set folderList to rest of folderList
         end repeat
      end if
   end tell
end digFolder

on theResult(directoryList, aFolder)
   set delims to AppleScript's text item delimiters
   set AppleScript's text item delimiters to return
   set printList to directoryList as text
   set AppleScript's text item delimiters to delims
   tell application "Finder"
      set startupDisk to startup disk as string
      set folderName to name of aFolder
   end tell
   set fileName to "Contents of " & folderName as string
   try
      set fileName to characters 1 thru 31 of fileName
   on error
   end try
   set fileRef to (aFolder as text) & fileName
   open for access file fileRef with write permission
   write printList to result
   close access file fileRef
   tell application "Finder"
      activate
      open aFolder
      open item fileRef using application file id "StØl"
      -- Requires the text editor Style by Marco Piovanelli, http://www.merzwaren.com
   end tell
end theResult
Muokattu maanantai 20. marraskuu 2000 21:00:46