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

63

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

Теги:
file-io

9 ответов

90
Лучший ответ

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

Вызов stat($fh) возвращает массив со следующей информацией о переданном дескрипторе файла (со страницы руководства perlfunc для 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 owner
  5 gid      numeric group ID of file 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 г. по Гринвичу). Из этого вы можете определить местное время:

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);
  • 0
    localtime ли localtime корректировать изменения часового пояса? Т.е.: файл создается в PST, затем читается mtime из CET. Я получаю запутанные результаты.
24

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

my $modtime = (stat($fh))[9]
18
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 owner
  5 gid      Numeric group ID of file 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.

13

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

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

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

my $last_mod_time = -M $file;

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

9

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

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

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

  • 2
    В google -M добавьте кавычки "-M", так как -X удаляет результаты, имеющие X ... Кстати, "-M" - это то, что хочет OP.
  • 1
    Было бы более естественно использовать «<» (чтобы проверить, является ли «file1.txt» более новым - так как «-C» возвращает возраст файла, а не дату (создания)) .
Показать ещё 1 комментарий
3

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

perldoc -f stat
3

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

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

Итак:

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

2

В моей FreeBSD система stat просто возвращает благословение.

$VAR1 = bless( [
                 102,
                 8,
                 33188,
                 1,
                 0,
                 0,
                 661,
                 276,
                 1372816636,
                 1372755222,
                 1372755233,
                 32768,
                 8
               ], 'File::stat' );

Вам нужно извлечь mtime следующим образом:

my @ABC = (stat($my_file));

print "-----------$ABC['File::stat'][9] ------------------------\n";

или

print "-----------$ABC[0][9] ------------------------\n";
1

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

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

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

Просто подумала, что поделюсь на тот случай, если у кого-то возникнут другие проблемы.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню