假设我有一个文件句柄$fh
。我可以使用-e $fh
或其文件大小-s $fh
或a slew of additional information about the file来检查其存在。如何获得最后修改的时间戳?
答案 0 :(得分:95)
您可以使用内置模块File::stat
(自Perl 5.004起包含)。
调用stat($fh)
返回一个数组,其中包含有关传入的文件句柄的以下信息(来自perlfunc man page for 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's owner
5 gid numeric group ID of file's 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将为您提供自纪元以来的最后修改时间( 1970年1月1日00:00 GMT )。由此您可以确定当地时间:
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);
答案 1 :(得分:23)
使用内置stat功能。或者更具体地说:
my $modtime = (stat($fh))[9]
答案 2 :(得分: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's owner
5 gid Numeric group ID of file's 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
这个时代是格林威治标准时间1970年1月1日00:00。
更多信息位于 stat 。
答案 3 :(得分:13)
您需要stat调用和文件名:
my $last_mod_time = (stat ($file))[9];
Perl也有不同的版本:
my $last_mod_time = -M $file;
但该值与程序启动时相关。这对排序等很有用,但你可能想要第一个版本。
答案 4 :(得分:9)
如果您只是比较两个文件以查看哪个较新,那么-C
应该有效:
if (-C "file1.txt" > -C "file2.txt") {
{
/* Update */
}
还有-M
,但我认为这不是你想要的。幸运的是,通过Google搜索这些文件操作符的文档几乎是不可能的。
答案 5 :(得分:3)
您可以使用stat()或File :: Stat模块。
perldoc -f stat
答案 6 :(得分:3)
我认为您正在寻找stat
函数(perldoc -f stat
)
特别是,返回列表的第9个字段(第10个,索引#9)是文件的最后修改时间(以秒为单位)。
所以:
my $last_modified = (stat($fh))[9];
答案 7 :(得分: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";
答案 8 :(得分: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";
想到我分享以防其他人遇到同样的麻烦。