简体   繁体   English

如何在 Perl 中获取文件的上次修改时间?

[英]How do I get a file's last modified time in Perl?

Suppose I have a filehandle $fh .假设我有一个文件句柄$fh I can check its existence with -e $fh or its file size with -s $fh or a slew of additional information about the file .我可以使用-e $fh检查它的存在,或者使用-s $fh检查它的文件大小或关于该文件的大量附加信息 How can I get its last modified time stamp?我怎样才能得到它最后修改的时间戳?

Calling the built-in function stat($fh) returns an array with the following information about the file handle passed in (from the perlfunc man page for stat ):调用内置函数stat($fh)返回一个数组,其中包含有关传入的文件句柄的以下信息(来自statperlfunc 手册页):

  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

Element number 9 in this array will give you the last modified time since the epoch ( 00:00 January 1, 1970 GMT ).此数组中的元素编号 9 将为您提供自纪元以来的最后修改时间(格林威治标准时间 1970 年 1 月 1 日 00:00 )。 From that you can determine the local time:从中您可以确定当地时间:

my $epoch_timestamp = (stat($fh))[9];
my $timestamp       = localtime($epoch_timestamp);

Alternatively, you can use the built-in module File::stat (included as of Perl 5.004) for a more object-oriented interface.或者,您可以使用内置模块File::stat (从 Perl 5.004 开始包含)以获得更面向对象的界面。

And to avoid the magic number 9 needed in the previous example, additionally use Time::localtime , another built-in module (also included as of Perl 5.004).并且为了避免前面示例中所需的幻数9,另外使用Time::localtime ,另一个内置模块(从 Perl 5.004 开始也包括在内)。 Together these lead to some (arguably) more legible code:这些一起导致了一些(可以说)更清晰的代码:

use File::stat;
use Time::localtime;
my $timestamp = ctime(stat($fh)->mtime);

Use the builtin stat function.使用内置的stat函数。 Or more specifically:或者更具体地说:

my $modtime = (stat($fh))[9]
my @array = stat($filehandle);

The modification time is stored in Unix format in $array[9].修改时间以 Unix 格式存储在 $array[9] 中。

Or explicitly:或明确:

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

The epoch was at 00:00 January 1, 1970 GMT.纪元是格林威治标准时间 1970 年 1 月 1 日 00:00。

More information is in stat .更多信息在stat 中

You need the stat call, and the file name:您需要 stat 调用和文件名:

my $last_mod_time = (stat ($file))[9];

Perl also has a different version: Perl 也有不同的版本:

my $last_mod_time = -M $file;

but that value is relative to when the program started.但该值与程序启动时间有关。 This is useful for things like sorting, but you probably want the first version.这对于排序之类的事情很有用,但您可能需要第一个版本。

If you're just comparing two files to see which is newer then -C should work:如果您只是比较两个文件以查看哪个文件较新,那么-C应该可以工作:

if (-C "file1.txt" > -C "file2.txt") {
{
    /* Update */
}

There's also -M , but I don't think it's what you want.还有-M ,但我认为这不是您想要的。 Luckily, it's almost impossible to search for documentation on these file operators via Google.幸运的是,几乎不可能通过 Google 搜索有关这些文件操作符的文档。

您可以使用 stat() 或 File::Stat 模块。

perldoc -f stat

I think you're looking for the stat function ( perldoc -f stat )我认为您正在寻找stat函数( perldoc -f stat

In particular, the item found at index 9 of the returned list (ie, the 10th field) is the last modify time of the file, in seconds since the epoch.特别地,在返回列表的索引 9(即第 10 个字段)处找到的项目是文件的最后修改时间,以自纪元以​​来的秒数为单位。

So:所以:

my $last_modified = (stat($fh))[9];

On my FreeBSD system, stat just returns a bless.在我的FreeBSD系统上, stat只是返回一个祝福。

$VAR1 = bless( [
                 102,
                 8,
                 33188,
                 1,
                 0,
                 0,
                 661,
                 276,
                 1372816636,
                 1372755222,
                 1372755233,
                 32768,
                 8
               ], 'File::stat' );

You need to extract mtime like this:您需要像这样提取mtime

my @ABC = (stat($my_file));

print "-----------$ABC['File::stat'][9] ------------------------\n";

or或者

print "-----------$ABC[0][9] ------------------------\n";

This is very old thread, but I tried using the solution and could not get the information out of File::stat.这是一个非常古老的线程,但我尝试使用该解决方案,但无法从 File::stat 中获取信息。 (Perl 5.10.1) (Perl 5.10.1)

I had to do the following:我必须执行以下操作:

my $f_stats = stat($fh);
my $timestamp_mod = localtime($f_stats->mtime);
print "MOD_TIME = $timestamp_mod \n";

Just thought I share in case anyone else had the same trouble.只是想我分享一下,以防其他人遇到同样的麻烦。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM