Perlのディレクトリハンドルでの 'stat'のセマンティクスは何ですか?

StackOverflow https://stackoverflow.com/questions/328946

  •  11-07-2019
  •  | 
  •  

質問

別の質問の調査で、Perlの stat 関数は引数として(ファイルハンドルまたはファイル名の代わりに)dirhandleを取ることができることに注意しました。

ただし、これの正しい使用例は見つかりません。Perlマニュアルにはありません。

誰でもそれを使用する方法の例を示すことができますか?

役に立ちましたか?

解決

ファイルまたはファイルハンドルの場合と同じ方法で使用します:

#!/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 と同じように使用します:

<~> $ 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 を使用して素敵な名前のアクセサーを取得するのが好きなので、5番目の要素がUIDであることを覚える(または検索する)必要はありません...)

ハンドルがファイルハンドルおよびディレクトリハンドルとして使用された場合、ディレクトリではなくファイルに統計が適用されることに注意してください:

$ 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?)

Windows(Perl 5.1)でPerl 5.10.1を使用していますが、dirhandleでstatを実行しても機能しません。ただし、ディレクトリのパス文字列で統計を行うと機能します。

動作

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

これはしません(&quot; dirfd関数は実装されていません...&quot;)

  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";
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top