Предположим, что у меня есть дескриптор файла $fh
. Я могу проверить его существование с -e $fh
или его размером файла с помощью -s $fh
или множество дополнительных сведений о файле. Как я могу получить последний измененный штамп времени?
Как получить последнее измененное время файла в Perl?
Ответ 1
Вы можете использовать встроенный модуль 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);
Ответ 2
Используйте встроенную функцию stat. Или более конкретно:
my $modtime = (stat($fh))[9]
Ответ 3
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.
Ответ 4
Вам нужен вызов stat и имя файла:
my $last_mod_time = (stat ($file))[9];
Perl также имеет другую версию:
my $last_mod_time = -M $file;
но это значение относится к началу работы программы. Это полезно для таких вещей, как сортировка, но вам, вероятно, нужна первая версия.
Ответ 5
Если вы просто сравниваете два файла, чтобы узнать, что является более новым, тогда -C
должен работать:
if (-C "file1.txt" > -C "file2.txt") {
{
/* Update */
}
Там также -M
, но я не думаю, что вы этого хотите. К счастью, практически невозможно найти документацию по этим файловым операциям через Google.
Ответ 6
Вы можете использовать stat() или модуль File:: Stat.
perldoc -f stat
Ответ 7
Я думаю, что вы ищете функцию stat
(perldoc -f stat
)
В частности, 9-е поле (10-е, индекс № 9) возвращаемого списка является последним временем изменения файла в секундах с начала эпохи.
Так:
my $last_modified = (stat($fh))[9];
Ответ 8
В моей 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";
Ответ 9
Это очень старая тема, но я попытался использовать решение и не смог получить информацию из File :: stat. (Perl 5.10.1)
Я должен был сделать следующее:
my $f_stats = stat($fh);
my $timestamp_mod = localtime($f_stats->mtime);
print "MOD_TIME = $timestamp_mod \n";
Просто подумала, что поделюсь на тот случай, если у кого-то возникнут другие проблемы.