IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Programmation et administration système Perl Discussion :

Adaptation code monitoring de dossier


Sujet :

Programmation et administration système Perl

  1. #1
    Membre à l'essai
    Homme Profil pro
    Débutant !!
    Inscrit en
    Novembre 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Débutant !!
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2015
    Messages : 29
    Points : 19
    Points
    19
    Par défaut Adaptation code monitoring de dossier
    Bonjour à tous,

    je chercher à adapter le (TRES BON) code suivant, afin de permettre le monitoring d'une liste de différents dossier, pas uniquement un seul, plutôt que de lancer x fois le code dans x consoles.

    Code : 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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
     
    #!/usr/bin/perl
     
     
     
    # Monitors a directory for file changes.
    #
    # Usage: directory_monitor.pl <directory>
    #
    # -- http://www.nooblet.org/blog
     
    # -------------------------------------------------------------------------------------------------------------
    ## Default directory to be monitored.
    my $directory = "T:/test";
     
    ## How long to sleep between checks, in seconds
    my $sleeptime = .1;
    # -------------------------------------------------------------------------------------------------------------
     
    use POSIX qw(ceil floor);
     
    $| = 1;
    # Directory on command-line
    if ($#ARGV >= 0) { $directory = join(' ', @ARGV); }
     
    # Directories need to have a trailing slash
    if (substr($directory,-1) ne "/") { $directory .= "/"; }
     
    # Check if the directory exists
    if (!-e $directory) {
    	print STDERR "'$directory' n'existe pas.\n";
    	exit(-1);
    }
     
    # Store file info here
    my %data;
    # individual file statistics placed in this global array
    my @gstat;
     
    # begin
    print "\nSuivi dossier: ".$directory."\n";
    print "\t(ctrl+c pour stopper)\n";
     
    # loop forever
    while (true) {
    	my $first = 0;
    	# Get directory handle
    	opendir(DIR, $directory) or die "Unable to open directory, $directory : $!";
    	# And loop through the contents
    	while (defined(my $filename = readdir(DIR))) {
    		# We only want files, not sub-directories
    		if (-d $directory.$filename) { next; }
    		# Get inode statistics
    		@gstat = &getstat($filename);
    		# If this is the first time it is being run, don't want to spam that every file is new, just add it to the hash
    		if (!scalar(%data)) { $first = 1; &update($filename); }
    		# subsequent files are added on first run
    		elsif ($first == 1) { &update($filename); }
    		# Not first run, and new file found
    		elsif (!scalar($data{$filename})) { &doPrint($filename, "Created. [".&printBytes($gstat[7])."]"); &update($filename); }
    		# The size has changed
    		elsif ($data{$filename}{'size'} != $gstat[7]) {
    			my $increase = $gstat[7] - $data{$filename}{'size'};
    			my $text = "Size changed to ".&printBytes($gstat[7]);
    			if ($increase > 0) { $text .= " (up ".&printBytes($increase).")"; }
    			elsif ($increase < 0) { $text .= " (down ".&printBytes($increase * -1).")"; }
    			&doPrint($filename, $text);
    			&update($filename);
    		}
    		# The modified time has changed
    		elsif ($data{$filename}{'mtime'} != $gstat[9]) {
    				&doPrint($filename, "Modified, size unchanged");
    			&update($filename);
    		}
    	}
    	# Clean up the directory handle
    	closedir(DIR);
    	# Check for files in the hash which are no longer in the directory
    	foreach $key (keys %data) {
    		if (! -e $directory.$key) {
    			&doPrint($key, "Deleted. Last modified at ".readTime($data{$key}{'mtime'})." (".&duration(time() - $data{$key}{'mtime'}).") [".&printBytes($data{$key}{'size'})."]");
    			delete($data{$key});
    		}
    	}
    	# Sleep for a bit, else it eats up the CPU
    	sleep($sleeptime);
    }
     
    # returns the time in the format <year><month><day>.<hour><minute><second> .. hardly readable but concise
    sub readTime {
    	my ($second, $minute, $hour, $dayOfMonth, $month, $yearOffset, $dayOfWeek, $dayOfYear, $daylightSavings) = localtime(shift(@_));
    	my $time = (1900+ $yearOffset).sprintf("%02d", $month).sprintf("%02d", $dayOfMonth).".".sprintf("%02d", $hour).sprintf("%02d", $minute).sprintf("%02d", $second);
    	return $time;
    }
     
    # Print out a file change in a consistent format
    sub doPrint {
    	my $fn = shift(@_);
    	my $t = shift(@_);
    	my $time = readTime(time());
    	print $time." : ".$fn."\t".$t."\n";
    }
     
    # Takes bytes are returns kilobytes, megabytes, gigabyte values instead based on set limits
    sub printBytes {
    	my $bytes = shift(@_);
    	if ($bytes <= 4096) { return $bytes."b"; }
    	$bytes = sprintf("%.2f",$bytes / 1024);
    	if ($bytes <= 1024) { return $bytes."k"; }
    	$bytes = sprintf("%.2f",$bytes / 1024);
    	if ($bytes <= 1024) { return $bytes."m"; }
    	$bytes = sprintf("%.2f",$bytes / 1024);
    	return $bytes."g";
    }
     
    # Take number of seconds and return duration, ie. 2d 4h 5m 14s
    sub duration {
    	my $time = shift(@_);
    	if ($time == 0) { return "just now"; }
    	my $string = "";
    	my $days = floor($time / 86400); $time = $time - ($days * 86400);
    	if ($days > 0) { $string .= $days."d "; }
    	my $hours = floor($time / 3600); $time = $time - ($hours * 3600);
    	if ($hours > 0) { $string .= $hours."h "; }
    	my $mins = floor($time / 60); $time = $time - ($mins * 60);
    	if ($mins > 0) { $string .= $mins."m "; }
    	my $secs = $time;
    	if ($secs > 0) { $string .= $secs."s "; }
    	$string .= "ago";
    	return $string;
    }
     
    # Populate array with inode statistics
    sub getstat {
    	my $fn = $_[0];
    	open(FILE, $directory.$fn);
    	my @stat = stat(FILE);
    	close(FILE);
    	return @stat;
    }
     
    # update the has with file info
    sub update {
    	my $fn = $_[0];
    	$data{$fn} = {
    		size => $gstat[7],
    		mtime => $gstat[9],
    	};
    }

    J'aurais voulu remplacer le $directory par un @directory=("T:/test1","T:/test2")
    et faire une espèce de boucle style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     for (my $i=0; $i<=$#directory;$i++)
     { 
     
    }
    et remplacer dans la suite les $directory par $directory[$i]

    Mais je ne sais pas où la caler...

    Désolé, je reste un grand débutant

    D'avance merci pour vos conseils !

    Cordialement,

  2. #2
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Citation Envoyé par kenobiwan88 Voir le message

    je chercher à adapter le (TRES BON) code suivant, afin de permettre le monitoring d'une liste de différents dossier, pas uniquement un seul, plutôt que de lancer x fois le code dans x consoles.
    Hum, très bon, pas vraiment. Non que le code soit mauvais en tant que tel, il fait sans doute ce dont tu as besoin, mais il est écrit comme on écrivait le Perl il y a 15 ou 20 ans, pas du tout en conformité avec les bonnes pratiques actuelles. Franchement, si je devais reprendre ce code, je commencerais par lui faire subir un gros toilettage.

    Sinon, pour moi, le plus simple serait de mettre la boucle while dans une fonction à appeler pour chaque répertoire de la liste.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Débutant !!
    Inscrit en
    Novembre 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Débutant !!
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2015
    Messages : 29
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par Lolo78 Voir le message

    Hum, très bon, pas vraiment. Non que le code soit mauvais en tant que tel, il fait sans doute ce dont tu as besoin ...
    Bonnjour,

    effectivement, je parlais plutôt de la fonctionnalité et du rendu que de la façon dont il est codé, tout simplement car je n'ai pas la compétence pour en juger.
    Je vais donc regarder du côté de votre conseil...

  4. #4
    Membre à l'essai
    Homme Profil pro
    Débutant !!
    Inscrit en
    Novembre 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Débutant !!
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2015
    Messages : 29
    Points : 19
    Points
    19
    Par défaut
    Bonjour,

    je nage complètement, quelqu'un aurait une piste ?
    il faut bien créer un sub avec comme argument le dossier, mais pour l'adaptation de la boucle while je galère un peu...

  5. #5
    Membre à l'essai
    Homme Profil pro
    Débutant !!
    Inscrit en
    Novembre 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Débutant !!
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2015
    Messages : 29
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par kenobiwan88 Voir le message
    Bonjour,

    je nage complètement, quelqu'un aurait une piste ?
    il faut bien créer un sub avec comme argument le dossier, mais pour l'adaptation de la boucle while je galère un peu...
    Mes excuses, mon code actuel avec :

    Et la fonction "watchit"

    Code : 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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
     
     
    # -------------------------------------------------------------------------------------------------------------
    ## Default directory to be monitored.
    my @directory = ("C:/","C:/windows","C:/windows/temp/");
     
     
    ## How long to sleep between checks, in seconds
    my $sleeptime = 1;
    # -------------------------------------------------------------------------------------------------------------
     
    use POSIX qw(ceil floor);
     
    $| = 1;
     
    # Check if the directory exists
    #if (!-e $directory) {
    #	print STDERR "'$directory' n'existe pas.\n";
    #	exit(-1);
    #}
     
    # Store file info here
    my %data;
    # individual file statistics placed in this global array
    my @gstat;
     
    # begin
    #print "\n Fichier suivi: ".$directory."\n";
    #print "\t(ctrl+c pour stopper)\n\n";
     
     
     
    	 for (my $i=0; $i<=$#directory;$i++)
     {
      print("$directory[$i]\n");
     watchit($directory[$i]);
     }
     
     
     
     
     #fonction qui appelles les directory
    sub watchit
    {
    my ($directory)=@_;
     
    print("$directory\n");
     
    while (true) {
     
    	my $first = 0;
    	# Get directory handle
    	opendir(DIR, $directory) or die "Impossible d'ouvrir le répertoire, $directory : $!";
    	# And loop through the contents
    	while (defined(my $filename = readdir(DIR))) {
    		# We only want files, not sub-directories
    		if (-d $directory.$filename) { next; }
    		# Get inode statistics
    		@gstat = &getstat($filename);
    		# If this is the first time it is being run, don't want to spam that every file is new, just add it to the hash
    		if (!scalar(%data)) { $first = 1; &update($filename); }
    		# subsequent files are added on first run
    		elsif ($first == 1) { &update($filename); }
    		# Not first run, and new file found
    		elsif (!scalar($data{$filename})) { &doPrint($filename, "Creation. [".&printBytes($gstat[7])."]"); &update($filename); }
    		# The size has changed
    		elsif ($data{$filename}{'size'} != $gstat[7]) {
    			my $increase = $gstat[7] - $data{$filename}{'size'};
    			my $text = "Size changed to ".&printBytes($gstat[7]);
    			if ($increase > 0) { $text .= " (up ".&printBytes($increase).")"; }
    			elsif ($increase < 0) { $text .= " (down ".&printBytes($increase * -1).")"; }
    			&doPrint($filename, $text);
    			&update($filename);
    		}
    		# The modified time has changed
    		elsif ($data{$filename}{'mtime'} != $gstat[9]) {
    				&doPrint($filename, "Modification, taille inchangee");
    			&update($filename);
    		}
    	}
    	# Clean up the directory handle
    	closedir(DIR);
    	# Check for files in the hash which are no longer in the directory
    	foreach $key (keys %data) {
    		if (! -e $directory.$key) {
    			&doPrint($key, "Suppression, modification pour la dernière fois le ".readTime($data{$key}{'mtime'})." (".&duration(time() - $data{$key}{'mtime'}).") [".&printBytes($data{$key}{'size'})."]");
    			delete($data{$key});
    		}
    	}
    	# Sleep for a bit, else it eats up the CPU
    	sleep($sleeptime);
    }
     
    }
     
     
     
     
     
     
    # returns the time in the format <year><month><day>.<hour><minute><second> .. hardly readable but concise
    sub readTime {
    	my ($second, $minute, $hour, $dayOfMonth, $month, $yearOffset, $dayOfWeek, $dayOfYear, $daylightSavings) = localtime(shift(@_));
    	my $time = (1900+ $yearOffset).sprintf("%02d", $month).sprintf("%02d", $dayOfMonth).".".sprintf("%02d", $hour).sprintf("%02d", $minute).sprintf("%02d", $second);
    	return $time;
    }
     
    # Print out a file change in a consistent format
    sub doPrint {
    	my $fn = shift(@_);
    	my $t = shift(@_);
    	my $time = readTime(time());
    	print $time." : ".$fn."\t".$t."\n";
    }
     
    # Takes bytes are returns kilobytes, megabytes, gigabyte values instead based on set limits
    sub printBytes {
    	my $bytes = shift(@_);
    	if ($bytes <= 4096) { return $bytes."b"; }
    	$bytes = sprintf("%.2f",$bytes / 1024);
    	if ($bytes <= 1024) { return $bytes."k"; }
    	$bytes = sprintf("%.2f",$bytes / 1024);
    	if ($bytes <= 1024) { return $bytes."m"; }
    	$bytes = sprintf("%.2f",$bytes / 1024);
    	return $bytes."g";
    }
     
    # Take number of seconds and return duration, ie. 2d 4h 5m 14s
    sub duration {
    	my $time = shift(@_);
    	if ($time == 0) { return "just now"; }
    	my $string = "";
    	my $days = floor($time / 86400); $time = $time - ($days * 86400);
    	if ($days > 0) { $string .= $days."d "; }
    	my $hours = floor($time / 3600); $time = $time - ($hours * 3600);
    	if ($hours > 0) { $string .= $hours."h "; }
    	my $mins = floor($time / 60); $time = $time - ($mins * 60);
    	if ($mins > 0) { $string .= $mins."m "; }
    	my $secs = $time;
    	if ($secs > 0) { $string .= $secs."s "; }
    	$string .= "ago";
    	return $string;
    }
     
    # Populate array with inode statistics
    sub getstat {
    	my $fn = $_[0];
    	open(FILE, $directory.$fn);
    	my @stat = stat(FILE);
    	close(FILE);
    	return @stat;
    }
     
    # update the has with file info
    sub update {
    	my $fn = $_[0];
    	$data{$fn} = {
    		size => $gstat[7],
    		mtime => $gstat[9],
    	};
    }
    EDIT : cette version se perd dans la première boucle while et il n'en sort jamais,

    si je change et que je met la boucle while non pas dans la fonction mais autour de la boucle for, genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    while (true) {
     
    	 for (my $i=0; $i<=$#directory;$i++)
     {
      print("$directory[$i]\n");
     watchit($directory[$i]);
     }
    }
    et ben il recommence toujours à 0

  6. #6
    Membre à l'essai
    Homme Profil pro
    Débutant !!
    Inscrit en
    Novembre 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Débutant !!
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2015
    Messages : 29
    Points : 19
    Points
    19
    Par défaut
    Je me réponds tout seul, ca avance un peu ::

    Code : 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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
     
    # -------------------------------------------------------------------------------------------------------------
    ## Default directory to be monitored.
    my @directory = ("C:/","C:/windows/");
     
     
    ## How long to sleep between checks, in seconds
    my $sleeptime = 1;
    # -------------------------------------------------------------------------------------------------------------
     
    use POSIX qw(ceil floor);
     
    $| = 1;
     
     
    while (true) {
     
    	 for (my $i=0; $i<=$#directory;$i++)
     {
      print("$directory[$i]\n");
     watchit($directory[$i]);
     }
    } 
     
     #fonction qui appelles les directory
    sub watchit
    {
    my ($directory)=@_;
     
     
    # Store file info here
    my %data;
    # individual file statistics placed in this global array
    my @gstat;
     
     
    	my $first = 0;
    	# Get directory handle
    	opendir(DIR, $directory) or die "Impossible d'ouvrir le répertoire, $directory : $!";
    	# And loop through the contents
    	while (defined(my $filename = readdir(DIR))) {
    		# We only want files, not sub-directories
    		if (-d $directory.$filename) { next; }
    		# Get inode statistics
    		@gstat = &getstat($filename);
    		# If this is the first time it is being run, don't want to spam that every file is new, just add it to the hash
    		if (!scalar(%data)) { $first = 1; &update($filename); }
    		# subsequent files are added on first run
    		elsif ($first == 1) { &update($filename); }
    		# Not first run, and new file found
    		elsif (!scalar($data{$filename})) { &doPrint($filename, "Creation. [".&printBytes($gstat[7])."]"); &update($filename); }
    		# The size has changed
    		elsif ($data{$filename}{'size'} != $gstat[7]) {
    			my $increase = $gstat[7] - $data{$filename}{'size'};
    			my $text = "Size changed to ".&printBytes($gstat[7]);
    			if ($increase > 0) { $text .= " (up ".&printBytes($increase).")"; }
    			elsif ($increase < 0) { $text .= " (down ".&printBytes($increase * -1).")"; }
    			&doPrint($filename, $text);
    			&update($filename);
    		}
    		# The modified time has changed
    		elsif ($data{$filename}{'mtime'} != $gstat[9]) {
    				&doPrint($filename, "Modification, taille inchangee");
    			&update($filename);
    		}
    	}
    	# Clean up the directory handle
    	closedir(DIR);
    	# Check for files in the hash which are no longer in the directory
    	foreach $key (keys %data) {
    		if (! -e $directory.$key) {
    			&doPrint($key, "Suppression, modification pour la dernière fois le ".readTime($data{$key}{'mtime'})." (".&duration(time() - $data{$key}{'mtime'}).") [".&printBytes($data{$key}{'size'})."]");
    			delete($data{$key});
    		}
    	}
    	# Sleep for a bit, else it eats up the CPU
    	sleep($sleeptime);
     
    	print("termine\n");
     
    }
     
     
    # returns the time in the format <year><month><day>.<hour><minute><second> .. hardly readable but concise
    sub readTime {
    	my ($second, $minute, $hour, $dayOfMonth, $month, $yearOffset, $dayOfWeek, $dayOfYear, $daylightSavings) = localtime(shift(@_));
    	my $time = (1900+ $yearOffset).sprintf("%02d", $month).sprintf("%02d", $dayOfMonth).".".sprintf("%02d", $hour).sprintf("%02d", $minute).sprintf("%02d", $second);
    	return $time;
    }
     
    # Print out a file change in a consistent format
    sub doPrint {
    	my $fn = shift(@_);
    	my $t = shift(@_);
    	my $time = readTime(time());
    	print $time." : ".$fn."\t".$t."\n";
    }
     
    # Takes bytes are returns kilobytes, megabytes, gigabyte values instead based on set limits
    sub printBytes {
    	my $bytes = shift(@_);
    	if ($bytes <= 4096) { return $bytes."b"; }
    	$bytes = sprintf("%.2f",$bytes / 1024);
    	if ($bytes <= 1024) { return $bytes."k"; }
    	$bytes = sprintf("%.2f",$bytes / 1024);
    	if ($bytes <= 1024) { return $bytes."m"; }
    	$bytes = sprintf("%.2f",$bytes / 1024);
    	return $bytes."g";
    }
     
    # Take number of seconds and return duration, ie. 2d 4h 5m 14s
    sub duration {
    	my $time = shift(@_);
    	if ($time == 0) { return "just now"; }
    	my $string = "";
    	my $days = floor($time / 86400); $time = $time - ($days * 86400);
    	if ($days > 0) { $string .= $days."d "; }
    	my $hours = floor($time / 3600); $time = $time - ($hours * 3600);
    	if ($hours > 0) { $string .= $hours."h "; }
    	my $mins = floor($time / 60); $time = $time - ($mins * 60);
    	if ($mins > 0) { $string .= $mins."m "; }
    	my $secs = $time;
    	if ($secs > 0) { $string .= $secs."s "; }
    	$string .= "ago";
    	return $string;
    }
     
    # Populate array with inode statistics
    sub getstat {
    	my $fn = $_[0];
    	open(FILE, $directory.$fn);
    	my @stat = stat(FILE);
    	close(FILE);
    	return @stat;
    }
     
    # update the has with file info
    sub update {
    	my $fn = $_[0];
    	$data{$fn} = {
    		size => $gstat[7],
    		mtime => $gstat[9],
    	};
    }

    J'ai compris comment ca roulait, il reste juste ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    # Store file info here
    my %data;
    # individual file statistics placed in this global array
    my @gstat;
    si je les mets dans la fonction watchit, ils se réinitialisent à chaque fois et donc la boucle ne s'en souvient pas, il n'affiche jamais rien, parce que pour le deuxieme dossier, il écrase par rapport au premier
    si je les mets dans le while(true), il se rappelle pas et m'affiche tout comme nouvellement créé à chaque itération..

    il me faudrait peut être autant de "%data" et de "@gstat" que de dossier... mais la je ne vois pas comment procéder !

  7. #7
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    j'ai refait rapidement ton code (en simplifiant les affichages, tu pourras affiner les détails), afin de scruter une liste de répertoires dans une boucle infinie, et ça a l'air de marcher sur des tests simples (ajout et modification d'un fichier). Le programme ne traite pas la suppression de fichiers, mais tu as au moins une idée globale.

    Code : 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
     
    #!/usr/bin/perl
    use strict;
    use warnings;
    use Data::Dumper;
     
    # Monitors a directory for file changes.
    #
    # Usage: directory_monitor.pl <directory1 directory2 directory3 ...>
    #
     
    my $sleeptime = 2;
    my %dir_properties;
     
    die "Aucun répertoire passé en paramètre\n" unless @ARGV;
    my @directories = @ARGV;
    for my $dir (@directories) {
    	die "Le répertoire $dir n'existe pas\n" unless -d $dir;
    	checkdir($dir, "First");
    }
     
    while (1) {
    	sleep $sleeptime;
    #	print Dumper \%dir_properties; # (décommenter pour tester et visualiser le hash)
    	checkdir($_) for @directories ;
    }
     
    sub checkdir {
    	my ($dir, $flag) = @_;
    	my @files = grep { -f } glob ("$dir/*.*");
    	for my $file (@files) {
    		my @gstat = stat($file);
    		if ($flag) {
    			# création de l'entrée dans le hachage, car c'est la première fois
    			$dir_properties{$file} = { size => $gstat[7], mtime => $gstat[9]};
    		} else {
    			if (exists $dir_properties{$file}) {
    				next if $dir_properties{$file}{size} == $gstat[7] and $dir_properties{$file}{mtime} == $gstat[9];
    				print "Le fichier $file a été modifié\n";
    			} else {
    				print "Le fichier $file a été créé\n";
    			}
    			# mise à jour ou création dans le hachage
    			$dir_properties{$file} = { size => $gstat[7], mtime => $gstat[9]};
    		}
    	}
    }
    NB: ça ne marchera pas bien si deux répertoires ont des fichiers ayant des noms identiques. Dans ce cas, il faudrait modifier un peu le hachage et la façon de l'alimenter. Demande si tu ne trouves pas comment.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Débutant !!
    Inscrit en
    Novembre 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Débutant !!
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2015
    Messages : 29
    Points : 19
    Points
    19
    Par défaut
    Merci infiniment Lolo, c'est déja une énorme marche pour moi.

    Dans l'ordre j'aimerai déja rajouter la notification de suppression.

    Mais avant ca, je cherche depuis 30min, si je passe des répertoires du type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     "C:/REPERTOIRE AVECESPACE/"
    avec des espaces dans la table de hachage reste vide, et donc il ne repere rien...
    as tu une idée ?

    Excellente soirée

  9. #9
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Si tes noms de répertoires ont des espaces, ça ne va pas être simple de les passer à la ligne de commande, parce que Perl sépare les arguments passés au programme selon les espaces. Donc, un répertoire avec un espace sera interprété comme deux paramètres distincts, donc deux répertoires.

    Je n'ai pas trop l'habitude de cette problématique, car utilisant très peu Perl sous Windows, et, sous Unix ou Linux, on évite généralement des répertoires avec espaces.

    Il faut donc peut-être prévoir de mettre la liste des répertoires dans un fichier de comparaison au lieu de la passer en argument à la ligne de commande, ou alors ruser et trouver une astuce du genre passer "C:/REPERTOIRE#AVECESPACE" au programme, puis, au début du programme remplacer le # par un espace.

    Exemple d'essai de cette astuce avec Perl sous Windows à la ligne de commande:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    C:\Users\Laurent>perl -e "$c = shift; $c =~ s/#/ /g; print $c;" C:/REPERTOIRE#AVEC#ESPACE
    C:/REPERTOIRE AVEC ESPACE
    Donc, ça a l'air de marcher, il suffirait d'appliquer cette substitution à chacun des éléments du tableau @ARGV.

  10. #10
    Membre à l'essai
    Homme Profil pro
    Débutant !!
    Inscrit en
    Novembre 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Débutant !!
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2015
    Messages : 29
    Points : 19
    Points
    19
    Par défaut
    Salut Lolo,

    je te remercie.

    En pratique je n'ai pas besoin de passer (pour le moment) les chemins en paramètres, je peux les mettre en dur dans le code.

    j'ai donc fait un truc comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    my @directories=("C:/Users/AVEC#ESPACE1/","C:/Users/AVEC#ESPACE2/");
     
     #Substitution des #
      	for (my $i=0; $i<=$#directories;$i++)
     {
     $directories[$i] =~ s/#/ /g;
     print("$directories[$i]\n");
    }
    le print rend bien la bonne tête, mais j'u comprend rien, si je regarde le dumper, j'ai
    irrémédiablement... Cependant la boucle vérifiant l'existence des dossiers ne met renvoit pas d'erreur.
    je suppute un gros soucis de syntaxe de chemin d'accès sur windows... c'est ma foi déplaisant !
    Je vais continuer les tests en essayant d'autre syntaxe...


    Excellente journée,

  11. #11
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Je ne pense pas que ces espace devraient poser problème. Je ne pourrais essayer que quand je serai chez moi, ici au bureau, je n'ai pas de Perl sous Windows.

    Pour l'instant, je te suggère d'étudier ceci:

    http://perl.developpez.com/faq/perl/...gage-sous-Perl

    Ceci te permettra de voir ce que fait le programme dans la boucle principale. En particulier de voir ce que récupère cette ligne de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    my @files = grep { -f } glob ("$dir/*.*");

  12. #12
    Membre à l'essai
    Homme Profil pro
    Débutant !!
    Inscrit en
    Novembre 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Débutant !!
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2015
    Messages : 29
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par Lolo78 Voir le message
    Je ne pense pas que ces espace devraient poser problème. Je ne pourrais essayer que quand je serai chez moi, ici au bureau, je n'ai pas de Perl sous Windows.

    Pour l'instant, je te suggère d'étudier ceci:

    http://perl.developpez.com/faq/perl/...gage-sous-Perl

    Ceci te permettra de voir ce que fait le programme dans la boucle principale. En particulier de voir ce que récupère cette ligne de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    my @files = grep { -f } glob ("$dir/*.*");
    Merci infiniment pour ton temps lolo, j'avance !!

    J'ai regardé en détail les fonctions grep et glob.
    Ca m'a permis de trouver une astuce concernant glob et les espaces, que j'ai donc essayé de modifier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    use File::Glob qw(bsd_glob);
    Ce qui donne au global ceci :

    Code : 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
    63
    64
     
    use strict;
    use warnings;
    use Data::Dumper;
    use File::Glob qw(bsd_glob);
    # Monitors a directory for file changes.
    #
    # Usage: directory_monitor.pl <directory1 directory2 directory3 ...>
    #
     
    my $sleeptime = 1;
    my %dir_properties;
     
    #die "Aucun répertoire passé en paramètre\n" unless @ARGV;
    #my @directories = @ARGV;
     
     
     # Ajout d'autres répertoires
    my @directories=("C:/USERS/AVEC#ESPACE/","C:/USERS/SANSESPACE/");
     
     #Substitution des #
      	for (my $i=0; $i<=$#directories;$i++)
     {
     $directories[$i] =~ s/#/ /g;
     print("$directories[$i]\n");
    }
     
     
     for my $dir (@directories) {
    	die "Le repertoire $dir n'existe pas\n" unless -d $dir;
    	checkdir($dir, "First");
    }
     
    while (1) {
    	sleep $sleeptime;
    	#print Dumper \%dir_properties; # (décommenter pour tester et visualiser le hash)
    	checkdir($_) for @directories ;
    }
     
    sub checkdir {
    	my ($dir, $flag) = @_;
    	my @files = grep { -d | -f } bsd_glob ("$dir/*");
    #	my @files = bsd_glob ("$dir/*");		
     
    		for my $file (@files) {
    		my @gstat = stat($file);
     
     
    		if ($flag) {
    			# création de l'entrée dans le hachage, car c'est la première fois
    			$dir_properties{$file} = { size => $gstat[7], mtime => $gstat[9]};
    		} else {
    			if (exists $dir_properties{$file}) {
     
    				next if $dir_properties{$file}{size} == $gstat[7] and $dir_properties{$file}{mtime} == $gstat[9] ;
    								print ("Le fichier $file a ete modifie\n");
    			} else {
    				print "MAJ : $file cree\n";
    			}
    			# mise à jour ou création dans le hachage
    			$dir_properties{$file} = { size => $gstat[7], mtime => $gstat[9]};
    		}
    	}
    }
    A ce stade, j'arrive à récupérer les infos des dossiers avec espace.
    J'ai tenté une modification pour aussi avoir les sous-répertoires (pour créer + tard un programme qui permet d'afficher la liste sur demande, plutôt que les mises à jour"

    A noter que lors d'un changement de nom de dossier ou de fichier il me met une "creation".

    La suite pour moi donc :

    - si changement de nom, passer en "modification" plutôt qu'en "creation"
    - implémenter la suppression.


    NB : a noter que si l'on surveille un répertoire sur un réseau, le code renvoie des modifications des sous répertoires à quasi toute les occurrences de la boucle while...

  13. #13
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par kenobiwan88 Voir le message
    A ce stade, j'arrive à récupérer les infos des dossiers avec espace.
    Donc, un problème résolu. Pas besoin pour moi de tester, ça tombe bien, à cette heure-ci, je n'avais pas trop envie.
    Citation Envoyé par kenobiwan88 Voir le message
    J'ai tenté une modification pour aussi avoir les sous-répertoires (pour créer + tard un programme qui permet d'afficher la liste sur demande, plutôt que les mises à jour"
    Hum, je craignais un peu cela. Pour moi, c'est un peu prématuré, car ce que tu veux faire avec eux n'est pas très clair. En particulier: que veux-tu faire avec des sous-sous-répertoires? et des sous-sous-sous-répertoires? Rien de bien compliqué, en fait, mais il faut bien réfléchir aux objectifs de ton programme. Je dirais: laisse cela de côté pour l'instant. On pourra y revenir.
    Citation Envoyé par kenobiwan88 Voir le message
    A noter que lors d'un changement de nom de dossier ou de fichier il me met une "creation".
    C'est clair. Si un fichier (ou un répertoire) change de nom, ce n'est plus le même puisqu'on l'identifie avec son nom. Et là on tombe dans des trucs bien difficiles à identifier: comment savoir si un fichier ou un répertoire est nouveau ou si c'est un renommage? S'il y a une réponse, elle est sans doute fonctionnelle et non technique... Ou peut-être y a-t-il une solution technique dans certains, cas, mais elle sera sans doute différente selon l'OS.
    Citation Envoyé par kenobiwan88 Voir le message
    La suite pour moi donc :

    - si changement de nom, passer en "modification" plutôt qu'en "creation"
    Hum, pas simple, comme expliqué ci-dessus.
    Citation Envoyé par kenobiwan88 Voir le message
    - implémenter la suppression.
    Pas de problème, je sais comment faire. Mais avant de modifier l'existant, convient-il a ce qu'il est censé faire?
    Citation Envoyé par kenobiwan88 Voir le message
    NB : a noter que si l'on surveille un répertoire sur un réseau, le code renvoie des modifications des sous répertoires à quasi toute les occurrences de la boucle while...
    Là, je suis surpris et je ne sais pas, et le lien que je t'ai donné sur le débogage devient sans doute crucial pour comprendre pourquoi.

  14. #14
    Membre à l'essai
    Homme Profil pro
    Débutant !!
    Inscrit en
    Novembre 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Débutant !!
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2015
    Messages : 29
    Points : 19
    Points
    19
    Par défaut
    Merci pour cette mise en perspective.

    A ce stade comme tu dis, mon but est, pour la liste de répertoire donné, de monitoré des ajouts/suppression de fichiers, et éventuellement de sous-répertoire. Mais je "m'en fiche" pour le moment de ce qu'il se passe dans les sous-répertoire.
    DONC, tu as raison ca me va pour la création au lieu de la modification si changement de nom. Le terme "modification" étant réservé pour le changement de taille enfait.
    Ainsi, si tu pouvais me filer le dernier coup de pouce pour la suppression, j'aurai absolument tout ce qu'il me faut, et t'en devrais une belle pour toute l'aide apportée

  15. #15
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par kenobiwan88 Voir le message
    Ainsi, si tu pouvais me filer le dernier coup de pouce pour la suppression, j'aurai absolument tout ce qu'il me faut, et t'en devrais une belle pour toute l'aide apportée
    OK, je peux te faire cela. Je repars de la dernière version que tu as postée? Sinon, poste la version sur laquelle tu veux que je le fasse.

  16. #16
    Membre à l'essai
    Homme Profil pro
    Débutant !!
    Inscrit en
    Novembre 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Débutant !!
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2015
    Messages : 29
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par Lolo78 Voir le message
    OK, je peux te faire cela. Je repars de la dernière version que tu as postée? Sinon, poste la version sur laquelle tu veux que je le fasse.
    La dernière version postée c'est parfait merci infiniment !

  17. #17
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Voilà.

    Modifications:
    - Ajout d'un étage d'imbrication dans le hachage pour gérer correctement des noms de fichiers identiques dans des répertoires différents et ajustements du code en conséquence à différents endroits;
    - Ajout d'une boucle supplémentaire dans checkdir pour détecter les suppression de fichiers ou de répertoires
    - Un peu de nettoyage a droite ou à gauche.


    Code : 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
    63
    64
    65
     
    use strict;
    use warnings;
    use Data::Dumper;
    use File::Glob qw(bsd_glob);
    # Monitors a directory for file changes.
    #
    # Usage: directory_monitor.pl <directory1 directory2 directory3 ...>
    #
     
    my $sleeptime = 1;
    my %dir_properties;
     
    #die "Aucun répertoire passé en paramètre\n" unless @ARGV;
    #my @directories = @ARGV;
     
     
     # Ajout d'autres répertoires
    my @directories=("C:/USERS/AVEC#ESPACE/","C:/USERS/SANSESPACE/");
    # @directories = @ARGV;
     
     
    for my $dir (@directories) {
        $dir =~ s/#/ /g;
        die "Le repertoire $dir n'existe pas\n" unless -d $dir;
        print "$dir\n";
        checkdir($dir, "First"); # initialisation du hash
    }
     
     
    while (1) {
    	sleep $sleeptime;
    	# print Dumper \%dir_properties; # (décommenter pour tester et visualiser le hash)
    	checkdir($_) for @directories ;
    }
     
    sub checkdir {
    	my ($dir, $flag) = @_;
    	my @files = grep { -d | -f } bsd_glob ("$dir/*");
     
    	# Recherche des suppressions
    	my %current_files = map { $_ => 1 } @files;
    	for my $previous_file ( keys %{$dir_properties{$dir} }) {
    		next if exists $current_files{$previous_file};
    		print "Le fichier $previous_file du répertoire $dir a disparu\n";
    		delete $dir_properties{$dir}{$previous_file}; # suppression du fichier disparu
    	}
     
     	# Recherche des modifications ou ajouts
    	for my $file (@files) {
    		my @gstat = stat($file);
     
     
    		unless ($flag) {
    			if (exists $dir_properties{$dir}{$file}) { 
    				next if $dir_properties{$dir}{$file}{size} == $gstat[7] and $dir_properties{$dir}{$file}{mtime} == $gstat[9] ;
    				print ("Le fichier $file du répertoire $dir a ete modifie\n");
    			} else {
    				print "MAJ : $file cree dans le répertoire $dir\n";
    			}
    		}
    		# mise à jour ou création dans le hachage
    		$dir_properties{$dir}{$file} = { size => $gstat[7], mtime => $gstat[9]};
    	}
    }
    J'ai testé rapidement les différents cas de figure (ajout, suppression, modification de fichiers), ça semble bien fonctionner (mais je n'ai pas testé des répertoires avec espaces).

Discussions similaires

  1. monitoring de dossier
    Par dahtah dans le forum Général Java
    Réponses: 2
    Dernier message: 30/11/2009, 11h09
  2. Parser JSON avec $.getJSON jquery adaptation code
    Par MatthieuFourcade dans le forum jQuery
    Réponses: 2
    Dernier message: 22/06/2009, 10h17
  3. Adapter Code Delphi 7 à Delphi 2009
    Par mmsalem dans le forum API, COM et SDKs
    Réponses: 12
    Dernier message: 18/03/2009, 17h42
  4. adaptation code treeview
    Par clemasson dans le forum VBA Access
    Réponses: 1
    Dernier message: 29/05/2008, 16h44
  5. adaptation code load_page ajax et js
    Par clara1 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 14/05/2008, 20h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo