giovedì 18 febbraio 2016

Ricerca file in windows

Le ultime versioni di Windows hanno reso praticamente impossibile trovare i file con gli strumenti di ricerca di Windows. Non funzionano, forse perchè si basano sull'indicizzazione, comunque è assicurato che non troverete mai più i vostri file facendo una semplice ricerca.
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