mercredi 11 juin 2008

Rechercher un fichier dans un répertoire

A présent, nous allons vous montrer comment faire un programme qui permet de rechercher un fichier avec une certaine extension dans un répertoire donné. Ce programme s'apparente par exemple à l'outil Rechercher de Windows.


L'utilisateur doit rentrer le nom du répertoire puis s'il le souhaite une partie ou l'ensemble du nom de fichier recherché ainsi que l'extension

nomrep=""
while (!File.directory?(nomrep))
puts "Rentrez le nom du répertoire"
nomrep=gets.chomp
$rep=nomrep
end

#L'utilisateur rentre ou non une partie ou l'ensemble du nom de fichier recherché
fichierrech=""
puts "Entrez ou non une partie ou l'ensemble du nom de fichier recherché"
fichierrech=gets.chomp
$fichierrech=fichierrech


exttapee=""
puts "Indiquer ou non l'extension du fichier que vous voulez rechercher"
exttapee=gets.chomp
$ext=exttapee

La méthode récursive suivante explore chaque répertoire et pour chaque fichier teste s'il correspond à la requête
On utilise pour cela encore une fois les expressions régulières
/\w*#{$fichierrech}\w*\.#{$ext}/
\w : une séquence qui contient tous les caractères constituant les mots. On aurait pu écrire à la place [A-Za-z0-9_]
p* : il doit y avoir 0 ou n occurrence(s) de p
\. : le point est un métacaractère, il indique une occurrence de n'importe quel caractère. Comme on souhaite le rechercher dans la chaîne traitée, on l'a donc précédé d'un \
On recherche donc une chaîne qui contient 0 ou n caractères puis le nom du fichier puis O ou n caractères puis le . puis l'extension

def explore(repertoire,tablo)
Dir.open(repertoire) do |rep|
rep.each do |nom|
if nom!='.'&&nom!='..'
if File.directory?(repertoire+'/'+nom)
explore(repertoire+'/'+nom,tablo)
else
if nom=~ /\w*#{$fichierrech}\w*\.#{$ext}/
tablo.push(repertoire+nom)
end
end
end
end
end
end

On appelle la méthode, on écrit dans le fichier le résultats
tablo=[]
explore($rep,tablo)

nvofichier="recherche#{$ext}"
nomfichier = File.new(nvofichier,'w')
tablo.each { |element|
nomfichier.write element+"\n"
}
nomfichier.close
puts "Les résultats des requêtes ont été enregistrés sur ce fichier #{nvofichier}"

Nous avons comparé l'outil Rechercher de Windows et ce programme
Pour une recherche dans C:\Documents and Settings avec un mot clé et l'extension .jpg
Programme ruby : 6,65 secondes
Outil rechercher (avec la recherche sur les images et photos) : 16,97 s

Pour une recherche dans le même répertoire sans extension particulière
Programme ruby : 6,97 secondes
Outil rechercher : 17,87 s

Pour ces recherches, le programme est plus que deux fois plus rapide que l'outil de Windows. Cependant, ce dernier possède des fonctionnalités que le programme ruby ne contient pas comme de pouvoir accéder directement aux fichiers trouvés par l'interface graphique.
Pour le premier essai, il faut aussi penser que l'outil windows recherche dans toutes les extensions d'image : jpg, bmp, tif ... notre programme ne fait une recherche que sur les fichiers jpg.
Cependant pour une recherche correspondant aux critères : recherche d'un fichier sur une extension particulière, le programme ruby est bien plus performant

Aucun commentaire: