代码之家  ›  专栏  ›  技术社区  ›  Alnitak

Perl中dirhandle上的“stat”的语义是什么?

  •  1
  • Alnitak  · 技术社区  · 17 年前

    在研究另一个问题时,我注意到 stat Perl中的函数可以将dirhandle作为其参数(而不是filehandle或filename)。

    然而,我找不到任何正确使用这个的例子——Perl手册中没有。

    4 回复  |  直到 17 年前
        1
  •  8
  •   Robert Gamble    17 年前

    #!/usr/bin/perl
    use strict;
    
    my $dir = shift;
    opendir(DIR, $dir) or die "Failed to open $dir: $!\n";
    my @stats = stat DIR;
    closedir(DIR);
    my $atime = scalar localtime $stats[8];
    
    print "Last access time on $dir: $atime\n";
    

    在目录句柄上使用stat的功能是在Perl 5.10中添加的,因此如果您关心可移植性,应该避免使用stat。

        2
  •  2
  •   genehack    17 年前

    你用它就像用它一样 stat 在文件句柄上:

    <~> $ mkdir -v foo ; perl -e 'opendir($dh , "./foo"); @s = stat $dh; print "@s"'
    mkdir: created directory `foo'
    2049 11681802 16877 2 1001 1001 0 4096 1228059876 1228059876 1228059876 4096 8
    

    (就我个人而言,我喜欢使用 File::stat

        3
  •  1
  •   ysth    17 年前

    $ perl -wl
    opendir $h, "." or die;
    open $h, "/etc/services" or die;
    print "dir:".readdir($h);
    print "file:".readline($h);
    print stat("/etc/services");
    print stat(".");
    print stat($h);
    close($h);
    print stat($h);
    __END__
    dir:.
    file:# Network services, Internet style
    
    205527886633188100018274122800783211967194861209994037409640
    20551515522168777410001000020480122803711512280371021228037102409640
    205527886633188100018274122800783211967194861209994037409640
    stat() on closed filehandle $h at - line 1.
        (Are you trying to call stat() on dirhandle $h?)
    
        4
  •  0
  •   user212117 user212117    16 年前

    我在windows上使用Perl5.10.1(ActivePerl),在dirhandle上执行stat不起作用。但是对目录的路径字符串进行统计是可行的。

      my $mtime = (stat( $directory ))[ 9 ];
      print "D $directory $mtime\n";
    

    这并不是(“dirfd函数未实现…”)

      my $dh;
      if( opendir( $dh, $directory ) == 0 ) {
        print "ERROR: can't open directory '$directory': $!\n";
        return;
      }
      $mtime = (stat( $dh ))[ 9 ];
      print "D $directory $mtime\n";