Le but de mon programme est de faire un bilan, à chaque run, des fichiers modifiés/nouveaux/effacés depuis le dernier run dudit programme.
Je stocke dans un fichier log un tableau associatif "nom de fichier->hashcode" (à l'aide de Storable, les hash étant générés avec le module Digest::MD5 et les noms de fichiers récupérés avec File::Find...).
J'ai donc un fichier log dont les lignes ressemblent à ceci :
Lors de chaque run, je veux, pour chaque fichier du répertoire analysé, vérifier si le hashcode correspondant à ce fichier est équivalent à celui enregistré dans mon log.
Code : Sélectionner tout - Visualiser dans une fenêtre à part d7a484bb05991519cd3812abd2792a1dA^@^@^@/home/moi/test/monfichier.png
Donc ça donnerait, selon moi :
Code perl : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62 #!/usr/bin/perl use strict; use File::Find; use Digest::MD5; use Getopt::Std; use Storable qw/store_fd fd_retrieve retrieve/; my %hash; my $hashref; #Test pour premier run (création fichier log) if(! -e "test.log") { foreach(@ARGV) { &File::Find::find(\&addFileInList,"$_"); } open(LOG,">test.log"); store_fd(\%hash, *LOG); close(LOG); } #Sinon... else { open(LOG,"+<test.log"); my $hashref = fd_retrieve(*LOG); foreach(@ARGV) { &File::Find::find(\&checkFile,"$_"); } close(LOG); } #Ajoute un couple "nom de fichier"-"hashcode" à la liste sub addFileInList { return unless -f $_; my $file = shift || $_; open(FILE,$file) or die "File error : can't open '$file': $!"; binmode(*FILE); $hash{$File::Find::name} = Digest::MD5->new->addfile(*FILE)->hexdigest; close(FILE); } #Vérifie si fichier présent dans la liste et modifié sub checkFile { return unless -f $_; my $file = shift || $_; my $fileName = $File::Find::name; if(exists($hashref->{$fileName})) { open(FILE,$file) or die "File error : can't open '$file': $!"; binmode(*FILE); my $hashKey = Digest::MD5->new->addfile(*FILE)->hexdigest; close(FILE); if(! $hashref->{$fileName} eq $hashKey) { print "Fichier modifié : ",$fileName,"\n"; $hashref->{$fileName} = $hashKey; } } }
Bref, ça ne fonctionne évidemment pas... Et je suppose que je n'ai juste strictement rien compris à Storable (et que la partie en gras dans le code n'a aucun sens)...
Quelqu'un peut m'indiquer une piste vers une solution ?
Partager