Как получить последнее изменение файла в Perl?
Предположим, у меня есть filehandle $fh
. Я могу проверить его существование с -e $fh
или ее размер с -s $fh
или множество дополнительной информации о файле. Как я могу получить его последний измененный штамп времени?
9 ответов:
вы можете использовать встроенный модуль
File::stat
(в комплекте с Perl 5.004).вызов
stat($fh)
возвращает массив со следующей информацией о переданном дескрипторе файла (из perlfunc man page forstat
):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 (perldoc-F stat)
в частности, 9-е поле (10-е, индекс #9) возвращенного списка является последним временем изменения файла в секундах с момента эпохи.
Так:
my $last_modified = (stat ($fh)) [9];
на FreeBSD
это очень старый поток, но я попытался использовать решение и не смог получить информацию из файла::stat. (Perl 5.10.1)
Я должен был сделать следующее:
my $f_stats = stat($fh); my $timestamp_mod = localtime($f_stats->mtime); print "MOD_TIME = $timestamp_mod \n";
просто подумал, что я разделяю, если у кого-то еще были такие же проблемы.