Как получить последнее изменение файла в Perl?


Предположим, у меня есть filehandle $fh. Я могу проверить его существование с -e $fh или ее размер с -s $fh или множество дополнительной информации о файле. Как я могу получить его последний измененный штамп времени?

9 58

9 ответов:

вы можете использовать встроенный модуль File::stat (в комплекте с Perl 5.004).

вызов stat($fh) возвращает массив со следующей информацией о переданном дескрипторе файла (из perlfunc man page for 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

9-й элемент в этом массиве даст вам последнее измененное время с эпохи (00:00 1 января 1970 GMT). Из этого вы можете определить местное время:

my $epoch_timestamp = (stat($fh))[9];
my $timestamp       = localtime($epoch_timestamp);

чтобы избежать магическое число 9 необходимо в предыдущем примере, дополнительно использовать Time::localtime, другой встроенный модуль (также включенный от Perl 5.004). Это требует некоторого (возможно) более разборчивого кода:

use File::stat;
use Time::localtime;
my $timestamp = ctime(stat($fh)->mtime);

используйте встроенный stat. Или более конкретно:

my $modtime = (stat($fh))[9]
my @array = stat($filehandle);

время модификации хранится в формате Unix в $ array[9].

или в явном виде:

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

эпоха была в 00: 00 1 января 1970 года по Гринвичу.

более подробная информация находится в stat.

вам нужен вызов stat и имя файла:

my $last_mod_time = (stat ($file))[9];

Perl также имеет другую версию:

my $last_mod_time = -M $file;

но это значение относительно момента запуска программы. Это полезно для таких вещей, как сортировка, но вы, вероятно, хотите первый вариант.

Если вы просто сравниваете два файла, чтобы увидеть, что новее, то -C должно работать:

if (-C "file1.txt" > -C "file2.txt") {
{
    /* Update */
}

там же -M, но я не думаю, что это то, что вы хотите. К счастью, практически невозможно найти документацию по этим файловым операторам через Google.

вы можете использовать stat () или модуль File::Stat.

perldoc -f stat

Я думаю, что вы ищете функцию stat (perldoc-F stat)

в частности, 9-е поле (10-е, индекс #9) возвращенного списка является последним временем изменения файла в секундах с момента эпохи.

Так:

my $last_modified = (stat ($fh)) [9];

это очень старый поток, но я попытался использовать решение и не смог получить информацию из файла::stat. (Perl 5.10.1)

Я должен был сделать следующее:

my $f_stats = stat($fh);
my $timestamp_mod = localtime($f_stats->mtime);
print "MOD_TIME = $timestamp_mod \n";

просто подумал, что я разделяю, если у кого-то еще были такие же проблемы.