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 tempend 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 ifend 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 repeatend 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