perl - 如何在 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: $!";
}
解决方案
您正在寻找utime
功能。
文档中的一些引用:
更改文件列表中每个文件的访问和修改时间。列表的前两个元素必须是 NUMERIC 访问和修改时间,按此顺序。返回成功更改的文件数。每个文件的inode更改时间设置为当前时间。
从 Perl 5.8.0 开始,如果列表的前两个元素是 undef,则
utime(2)
C 库中的系统调用将使用空的第二个参数调用。在大多数系统上,这会将文件的访问和修改时间设置为当前时间。
在支持 的系统上
futimes(2)
,您可以在文件之间传递文件句柄。在不支持的系统上futimes(2)
,传递文件句柄会引发异常。文件句柄必须作为 glob 或 glob 引用传递才能被识别;裸字被视为文件名。
所以,像:
utime undef, undef, $fh;
会将文件的修改(和访问)时间更新为当前时间。如果您不使用大多数系统,则文档中有另一个示例明确使用当前时间。
futimes(2)
存在于 Linux 和 BSD 上。如果您使用不同的操作系统,则必须使用文件名而不是句柄。
推荐阅读
- r - 将包传递到 R 中的 MPI 集群
- c++ - 仅由变量标识符组成的表达式类型
- actions-on-google - Google Assistant 忽略 FanSpeed,在恒温器上切换特征
- javascript - Svelte/Sapper.js - 如何使用 localStorage 数据初始化存储?
- python - 从另一个位置运行时如何在linux上获取绝对路径
- sas - 使用 Holdout 在 SAS 中做主成分并对新数据进行评分
- vb.net - 如何从VB中线程中使用的函数获取返回值。网
- python - Python webscraper 只返回“无”
- python - 从具有重复子树的嵌套列表构造树视图(使用 anytree/treelib)
- python - 如何根据文本颜色添加到数据框(样式框)