Comment puis-je obtenir la dernière modification d'un fichier en Perl?
Supposons que j'ai un filehandle $fh
. Je peux vérifier son existence avec -e $fh
, ou la taille du fichier avec -s $fh
ou un tas d'informations supplémentaires sur le fichier. Comment puis-je obtenir son dernier horodatage modifié?
9 réponses
Vous pouvez utiliser le module intégré File::stat
(inclus à partir de Perl 5.004).
L'appel à stat($fh)
renvoie un tableau contenant les informations suivantes sur le handle de fichier transmis (à partir de la page de manuel perlfunc pour stat
):
0 dev device number of filesystem
1 ino inode number
2 mode file mode (type and permissions)
3 nlink number of (hard) links to the file
4 uid numeric user ID of file's owner
5 gid numeric group ID of file's owner
6 rdev the device identifier (special files only)
7 size total size of file, in bytes
8 atime last access time since the epoch
9 mtime last modify time since the epoch
10 ctime inode change time (NOT creation time!) since the epoch
11 blksize preferred block size for file system I/O
12 blocks actual number of blocks allocated
Le 9ème élément de ce tableau vous donnera la dernière heure modifiée depuis l'époque ( 00: 00 Janvier 1, 1970 GMT). À partir de là, vous pouvez déterminer l'heure locale:
my $epoch_timestamp = (stat($fh))[9];
my $timestamp = localtime($epoch_timestamp);
Pour éviter les nombre magique 9 nécessaire dans le précédent exemple, utilisez en outre Time::localtime
, un autre module intégré (également inclus dans Perl 5.004). Cela nécessite un code (sans doute) plus lisible:
use File::stat;
use Time::localtime;
my $timestamp = ctime(stat($fh)->mtime);
Utilisez la fonction intégrée stat . Ou plus précisément:
my $modtime = (stat($fh))[9]
my @array = stat($filehandle);
L'Heure de modification est stockée au format Unix dans $ array [9].
Ou explicitement:
my ($dev, $ino, $mode, $nlink, $uid, $gid, $rdev, $size,
$atime, $mtime, $ctime, $blksize, $blocks) = stat($filepath);
0 dev Device number of filesystem
1 ino inode number
2 mode File mode (type and permissions)
3 nlink Number of (hard) links to the file
4 uid Numeric user ID of file's owner
5 gid Numeric group ID of file's owner
6 rdev The device identifier (special files only)
7 size Total size of file, in bytes
8 atime Last access time in seconds since the epoch
9 mtime Last modify time in seconds since the epoch
10 ctime inode change time in seconds since the epoch
11 blksize Preferred block size for file system I/O
12 blocks Actual number of blocks allocated
L'époque était à 00:00 Janvier 1, 1970 GMT.
Plus d'informations dans stat.
Vous avez besoin de l'appel stat et du nom du fichier:
my $last_mod_time = (stat ($file))[9];
Perl a également une version différente:
my $last_mod_time = -M $file;
Mais cette valeur est relative au démarrage du programme. Ceci est utile pour des choses comme le tri, mais vous voulez probablement la première version.
Si vous comparez simplement deux fichiers pour voir lequel est le plus récent, alors -C
devrait fonctionner:
if (-C "file1.txt" > -C "file2.txt") {
{
/* Update */
}
Il y a aussi -M
, mais je ne pense pas que ce soit ce que vous voulez. Heureusement, il est presque impossible de rechercher de la documentation sur ces opérateurs de fichiers via Google.
Vous pouvez utiliser stat () ou le module File:: Stat.
perldoc -f stat
Je pense que vous cherchez la fonction stat (perldoc-F stat)
En particulier, le 9ème champ (10ème, index #9) de la liste renvoyée est le dernier temps de modification du fichier en secondes depuis l'époque.
Donc:
Mon $LAST_MODIFIED = (stat ($fh)) [9];
Sur mon système FreeBSD , stat
renvoie juste une bénédiction.
$VAR1 = bless( [
102,
8,
33188,
1,
0,
0,
661,
276,
1372816636,
1372755222,
1372755233,
32768,
8
], 'File::stat' );
Vous devez extraire mtime
comme ceci:
my @ABC = (stat($my_file));
print "-----------$ABC['File::stat'][9] ------------------------\n";
Ou
print "-----------$ABC[0][9] ------------------------\n";
C'est un très vieux thread, mais j'ai essayé d'utiliser la solution et je n'ai pas pu extraire les informations de File::stat. (Perl 5.10.1)
Je devais faire ce qui suit:
my $f_stats = stat($fh);
my $timestamp_mod = localtime($f_stats->mtime);
print "MOD_TIME = $timestamp_mod \n";
Je pensais juste partager au cas où quelqu'un d'autre aurait le même problème.