Supposons que j'ai un descripteur de fichier $fh
. Je peux vérifier son existence avec -e $fh
ou sa taille de fichier avec -s $fh
ou ne foule d'informations supplémentaires sur le fichier . Comment puis-je obtenir son dernier horodatage modifié?
Vous pouvez utiliser le module intégré File::stat
(Inclus à partir de Perl 5.004).
L'appel de stat($fh)
renvoie un tableau contenant les informations suivantes sur le descripteur 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
L'élément numéro 9 dans ce tableau vous donnera la dernière heure modifiée depuis l'époque ( 00:00 le 1er janvier 1970 GMT). A partir de là, vous pouvez déterminer l'heure locale:
my $Epoch_timestamp = (stat($fh))[9];
my $timestamp = localtime($Epoch_timestamp);
Pour éviter le nombre magique 9 nécessaire dans l'exemple précédent, utilisez également Time::localtime
, Un autre module intégré (également inclus à partir de Perl). 5.004). Cela nécessite du 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 spécifiquement:
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 le 1er janvier 1970 GMT.
Plus d'informations sont dans stat.
Vous avez besoin de l'appel stat et du nom du fichier:
my $last_mod_time = (stat ($file))[9];
Perl a aussi une version différente:
my $last_mod_time = -M $file;
mais cette valeur est relative au début du programme. C'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 marcher:
if (-C "file1.txt" > -C "file2.txt") {
{
/* Update */
}
Il y a aussi -M
, mais je ne pense pas que c'est 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 neuvième champ (10, index n ° 9) de la liste renvoyée est la dernière heure de modification du fichier en secondes depuis l’époque.
Alors:
my $last_modified = (stat($fh))[9];
Sur mon FreeBSD système, stat
ne fait que renvoyer 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 fil, mais j'ai essayé d'utiliser la solution et je ne pouvais pas 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 que je partage au cas où quelqu'un aurait le même problème.