如何在Perl中设置文件最后修改的文件属性



这里我使用存储在本地目录中的last_run文件,如果它不等于当前日期时间,则更新它的上次修改日期。是否可以不在文件中写入符号,而是以其他方式更新mtime?

我看到有一个模块File::Touch,但我不想使用它,因为我已经打开了一个文件,而且按原样使用文件描述符会更快。

#!/usr/bin/perl
use utf8;
use strict;
use warnings;
use File::stat;
use DateTime;
my $file_name = "last_run";
if (-e $file_name)
{
my $fh;
if (open($fh, "+<", $file_name))
{
my $timestamp = stat($fh)->mtime;
my $now = DateTime->now(time_zone => 'local');
my ($sec, $min, $hour, $day, $month, $year) = localtime($timestamp);
$month += 1;
$year += 1900;
if ($now->day != $day or $now->month != $month or $now->year != $year)
{
print $fh ' '; # <- I have to write something into the file
}
print "$day $month $yearn";
print $now->day.' '.$now->month.' '.$now->year."n";
}
else
{
print "cannot open +< $file_name: $!";
}
close($fh);
}
else
{
open(my $fh, ">", $file_name)
or print "cannot open > file name: $!";
}

您正在寻找utime函数。

文件中的一些引文:

更改文件列表中每个文件的访问和修改时间。列表的前两个元素必须是NUMERIC访问和修改时间,按此顺序排列。返回成功更改的文件数。每个文件的inode更改时间都设置为当前时间。

由于Perl5.8.0,如果列表的前两个元素未定义,则使用空的第二个参数调用C库中的utime(2)系统调用。在大多数系统上,这会将文件的访问和修改时间设置为当前时间。

在支持futimes(2)的系统上,可以在文件之间传递文件句柄。在不支持futimes(2)的系统上,传递文件句柄会引发异常。文件句柄必须作为glob或glob引用传递才能被识别;裸词被认为是文件名。


所以,类似于:

utime undef, undef, $fh;

将文件的修改(和访问(时间更新为当前时间。如果您不使用大多数系统,文档中还有另一个示例明确使用当前时间。

futimes(2)存在于Linux和BSD上。如果使用不同的操作系统,则必须使用文件名而不是句柄。

最新更新