web-dev-qa-db-fra.com

Comment puis-je obtenir la dernière modification d'un fichier en Perl?

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é?

62
cowgod

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);
96
cowgod

Utilisez la fonction intégrée stat . Ou plus spécifiquement:

my $modtime = (stat($fh))[9]
24
Michael Carman
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.

18
David Segonds

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.

13
Paul Beckingham

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.

9
Dan Olson

Vous pouvez utiliser stat () ou le module File :: Stat.

perldoc -f stat
3
Chris Kloberdanz

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];

3
Lee

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";
2
holly

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.

1
MBW