Per questo motivo ho deciso di scrivere un programma di ricerca files, per di più la ricerca del testo sarà sulle espressioni regolari, che sono molto più potenti delle semplice carattere jolly *.
Il programma ha questo aspetto:
Durante la ricerca le ultime due righe ci diranno quanti file sono stati analizzati e in che directory sta cercando; in questo modo ci rendiamo conto di cosa fa il programma.
Ho messo un campo dove indicare la directory di partenza (startingFolder) e un campo dove mettere il nome o l'espressione regolare del nome da cercare (nomeFile). Ad esempio per cercare tutte le immagine JPG basta indicare .*jpg.
Poi abbiamo un campo con i risultati (listaFiles) in cui facendo doppio clic su una riga si apre la cartella relativa. Per poter cliccare sulle righe il ListBehavoir della è impostato su vero. Il codice di questo campo è:
on MouseDoubleUp
put the hilitedtext of me into temp
replace "/" with "\" in temp
set itemdel to "\"
put item 1 to -2 of temp into temp
put shell( "explorer " & quote & temp & quote) into temp
end MouseDoubleUp
Siccome lo uso su Windows lancio il programma di windows explorer per vedere la cartella, in Windows is fa così.
Se avessimo problemi con la ricerca, del tipo che non smette più di cercare, dobbiamo provvedere a mettere un pulsante per bloccare tutto, questo pulsante cambierà una proprietà che il programma continuerà a controllare per vedere se continuare o meno. Questa proprietà sarà avvio del pulsante find. Il codice del pulsante di stop sarà semplicemente:
on mouseUp
if the avvio of button "Find" then
answer warning "Search stopped"
set the avvio of button "Find" to false
end if
end mouseUp
Ora manca il codice per cercare il file, che metteremo dentro il pulsante find. Ecco il codice:
on mouseUp
set the avvio of me to true
put empty into field "listaFiles"
put 0 into field "numFiles"
cercafiles (field "startingFolder")
end mouseUp
on CercaFiles curFolder
put curFolder into field "curFolder"
set the defaultFolder to curFolder
put the files into temp
put the text of field "nomeFile" into nomeFile
if the hilite of button "Case sensitive" then
put "(?i)" before nomeFile
end if
repeat for each line tLine in temp
if the avvio of me is false then exit to top
add 1 to field "NumFiles"
if matchText(item 1 of tLine, nomeFile ) then
put Curfolder & "/"& item 1 of tLine & return after field "listaFiles"
end if
end repeat
wait 0 with messages
put the folders into temp2
repeat for each line tLine2 in temp2
if tLine2 is not "." and tLine2 is not ".." then
cercaFiles (curFolder & "/" & tLine2)
end if
end repeat
end CercaFiles
Notiamo i seguenti accorgimenti:
- il messaggio cercaFiles è il messaggio che effettivamente ricerca i files
- cercaFiles è un messaggio che richiama se stesso. Ogni volta farà la ricerca in una delle sotto cartelle della cartella di partenza
- usiamo la funzione matchText() per fare il controllo con l'espressione regolare
- se nella ricerca non vogliamo fare distinzioni fra lettere minuscole e maiuscole, anteponiamo la stringa (?i)
- evitiamo di controllare le directory "." e ".." che sono la rappresentazione della directory corrente e di quella superiore, altrimenti creeremmo dei cicli infiniti. Queste directory sono sempre fornite dai sistemi operativi quando si chiede una lista di directory.
- il codice wait 0 with messages è essenziale per poter interrompere il programma, altrimenti non controllerà abbastanza celermente altri messaggi, come quello del click sul pulsante stop per fermare i messaggi.
Il sorgente in livecode potete scaricarlo da qui: http://tinyurl.com/zogz64v
mentre l'eseguibile per windows da qui: http://tinyurl.com/jmqalpq
Nessun commento:
Posta un commento