(* 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