Domanda

Durante la ricerca di un'altra domanda ho notato che la funzione stat in Perl può assumere un dirhandle come argomento (anziché un filehandle o un nome file).

Comunque non riesco a trovare alcun esempio di uso corretto di questo - non ce ne sono nel manuale Perl.

Qualcuno può mostrare un esempio di come usarlo?

È stato utile?

Soluzione

Lo usi come fai per un file o un filehandle:

#!/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à di usare stat sugli handle di directory è stata appena aggiunta a Perl 5.10, quindi dovrebbe essere evitata se ti interessa la portabilità.

Altri suggerimenti

Lo usi proprio come faresti con stat su un filehandle:

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

(Personalmente, mi piace usare File :: stat per ottenere degli accessor con un bel nome, quindi non devo ricordare (o cercare) che il quinto elemento è l'UID ...)

Basta essere consapevoli del fatto che se un handle è mai stato usato come filehandle, oltre che come dirhandle, la stat verrà applicata al file, non alla directory:

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

Uso Perl 5.10.1 su Windows (ActivePerl) e fare stat su un dirhandle non funziona. Ma fare una stat sulla stringa del percorso della directory funziona.

lavori

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

no (" La funzione dirfd non è implementata ... ")

  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";
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top