首页 > 解决方案 > 如何在 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 $year\n";
        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: $!";
}

标签: perl

解决方案


您正在寻找utime功能。

文档中的一些引用:

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

从 Perl 5.8.0 开始,如果列表的前两个元素是 undef,则utime(2)C 库中的系统调用将使用空的第二个参数调用。在大多数系统上,这会将文件的访问和修改时间设置为当前时间。

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


所以,像:

utime undef, undef, $fh;

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

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


推荐阅读