Question

En cherchant une autre question, j'ai remarqué que la fonction stat de Perl peut prendre un dirhandle en tant qu'argument (au lieu d'un descripteur de fichier ou d'un nom de fichier).

Cependant, je ne trouve aucun exemple d'utilisation correcte, il n'y en a pas dans le manuel Perl.

Quelqu'un peut-il montrer un exemple d'utilisation?

Était-ce utile?

La solution

Vous l'utilisez de la même manière que pour un fichier ou un descripteur de fichier:

#!/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";

La possibilité d'utiliser stat sur les descripteurs de répertoires vient d'être ajoutée autour de Perl 5.10; vous devriez donc l'éviter si vous tenez à la portabilité.

Autres conseils

Vous l'utilisez exactement comme vous le feriez stat sur un descripteur de fichier:

<~> $ 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

(Personnellement, j'aime bien utiliser File :: stat pour obtenir de beaux accesseurs nommés, de sorte que je n'ai pas à me rappeler (ni à rechercher) que le cinquième élément est l'UID ...)

Sachez simplement que si un descripteur a déjà été utilisé comme descripteur de fichier, ainsi que un descripteur de répertoire, la statistique s'appliquera au fichier, pas au répertoire:

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

J'utilise Perl 5.10.1 sur Windows (ActivePerl) et la commande stat sur un dirhandle ne fonctionne pas. Mais faire une statistique sur la chaîne de chemin du répertoire fonctionne.

fonctionne

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

cela ne fonctionne pas ("La fonction dirfd n'est pas implémentée ...")

  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";
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top