http://qs1969.pair.com?node_id=1174643


in reply to MD5 checksums for Windows

When I run the script on my system, it runs for a while then stops with the following error ...

C:\tmp\Shared\Downloads>perl sum.pl -R c:/data/db 32768 aa8fe23d2d4c2495ff521b2efbefd30d c:/data/db/collection-0 +-3854299608590736422.wt 90112 540e61cd865a1c8e72255d658c00840b c:/data/db/collection-0 +-6126630059692173099.wt ... c:/data/db/index-4105-3854299608590736422.wt sum.pl[99] FATAL: Failed to open 'c:/data/db/mongod.lock' (Permission + denied)

I tried putting an if(-r $fname) around the md5 calculation, but I still get the same error.

Any ideas on how I can modify the script to skip past this file ?

Replies are listed 'Best First'.
Re^2: MD5 checksums for Windows
by aussiecoder (Acolyte) on Oct 25, 2016 at 04:55 UTC
    I've modified generate_md5sum to look like this ...
    sub generate_md5sum { my ($fname) = @_; my $sum = "file-not-readable "; my $o_md5 = Digest::MD5->new; my $fh = IO::File->new; if ( open( $fh, "+<", $fname ) ) { if ( flock( $fh, LOCK_EX | LOCK_NB ) ) { binmode($fh); $sum = $o_md5->addfile($fh)->hexdigest(); flock( $fh, LOCK_UN ); close $fh; if ($b_dups) { $h_sums ||= {}; my $a_files = $h_sums->{$sum} ||= []; push @$a_files, $fname; } } } return $sum; }
    Which allows the script to continue over locked or unreadable files. Is this a good solution to this problem ?
      Hi aussiecoder,

      Just now saw your two responses.

      I'm guessing that because you're on Windows, you have some other process vying for the file. Windows is much more restrictive than Linux when it comes to separate processes trying to access the same file.

      If that's the case, then yes it is probably a fine solution, especially since you're using the LOCK_NB (non-blocking) flag, as long as you're okay with that file's checksum being skipped if the other process accesses it first. The only thing I would worry about is that possibly the other process might fail for the same reason, unless it, too, incorporates file-locking.

      Cheers, golux

      say  substr+lc crypt(qw $i3 SI$),4,5