Path::Class::File::Stat - cache and compare stat() calls on a Path::Class::File object


Path-Class-File-Stat documentation Contained in the Path-Class-File-Stat distribution.

Index


Code Index:

NAME

Top

Path::Class::File::Stat - cache and compare stat() calls on a Path::Class::File object

SYNOPSIS

Top

  use Path::Class::File::Stat;
  my $file = Path::Class::File::Stat->new('path','to','file');

  # $file has all the magic of Path::Class::File

  # sometime later
  if ($file->changed)
  {
    # do something provocative
  }

DESCRIPTION

Top

Path::Class::File::Stat is a simple extension of Path::Class::File. Path::Class::File::Stat is useful in long-running programs (as under mod_perl) where you might have a file handle opened and want to check if the underlying file has changed.

METHODS

Top

Path::Class::File::Stat extends Path::Class::File objects in the following ways.

use_md5

Calling this method will attempt to load Digest::MD5 and use that instead of stat() for creating file signatures. This is similar to how File::Modified works.

changed

Returns the previously cached File::stat object if the file's device number and inode number have changed, or if the modification time or size has changed.

Returns 0 (false) otherwise.

While File::Modified uses a MD5 signature of the stat() of a file to determine if the file has changed, changed() uses a simpler (and probably more naive) algorithm. If you need a more sophisticated way of determining if a file has changed, use the restat() method and compare the cached File::stat object it returns with the current File::stat object.

Example of your own changed() logic:

 my $oldstat = $file->restat;
 my $newstat = $file->stat;
 # compare $oldstat and $newstat any way you like

Or just use File::Modified instead.

restat

Re-cache the File::stat object in the Path::Class::File::Stat object. Returns the previously cached File::stat object.

The changed() method calls this method internally if changed() is going to return true.

SEE ALSO

Top

Path::Class, Path::Class::File, File::Signature, File::Modified

AUTHOR

Top

Peter Karman, <karman@cpan.org>

COPYRIGHT AND LICENSE

Top


Path-Class-File-Stat documentation Contained in the Path-Class-File-Stat distribution.

package Path::Class::File::Stat;
use strict;
use warnings;
use base qw( Path::Class::File );

our $VERSION = '0.03';
my $debug = $ENV{PERL_DEBUG} || 0;

sub new {
    my $self = shift->SUPER::new(@_);
    $self->{_stat} = $self->stat;
    return $self;
}

sub use_md5 {
    my $self = shift;
    return 1 if exists $self->{_md5};
    require Digest::MD5;
    $self->{_md5} = Digest::MD5::md5( $self->slurp );
    return $self->{_md5};
}

sub changed {
    my $self = shift;
    if ( $self->{_md5} ) {
        my $old_md5 = $self->{_md5};
        $self->{_md5} = Digest::MD5::md5( $self->slurp );
        if ( $old_md5 ne $self->{_md5} ) {
            return $old_md5;
        }
        else {
            return 0;
        }
    }
    my $stat = $self->stat;

    if ((      $self->{_stat}->dev ne $stat->dev
            && $self->{_stat}->ino ne $stat->ino
        )
        || $self->{_stat}->mtime ne $stat->mtime
        || $self->{_stat}->size  ne $stat->size
        )
    {
        warn "$self is not the file it once was\n" if $debug;
        return $self->restat;
    }
    return 0;
}

sub restat {
    my $self = shift;
    my $old  = $self->{_stat};
    $self->{_stat} = $self->stat;
    return $old;
}

1;
__END__