in reply to How do I verify that a copied file's contents did not corrupt/modify?

2001-03-14 Edit by Corion : The content of this node was moved into the root node.

  • Comment on Re: How do I verify that a copied file's contents did not corrupt/modify?
  • Download Code

Replies are listed 'Best First'.
Re: Re: How do I verify that a copied file's contents did not corrupt/modify?
by jeroenes (Priest) on Mar 14, 2001 at 12:52 UTC
    You might wanna add some sysseek's to make sure Digest::MD5 reads the whole file. Moreover, you have the outfile only opened to write (prepend a plus to the opening string of destFile.

    Well, that doesn't explain the outcome of the comparison. (have to run....hint: OOP versus function)

    Jeroen
    "We are not alone"(FZ)

    Update: I modified your code, and it works. Tested on linux. BTW, yer original code MD'd the objects!

    #!/usr/bin/perl -w # -*-Perl-*- use strict; use FileHandle; use Digest::MD5; my $sourceFile = $ARGV[0]; my $destFile = $ARGV[1]; my $inFile = new FileHandle; my $outFile = new FileHandle; my $inMD5 = Digest::MD5->new; my $outMD5 = Digest::MD5->new; my ( $fileLength, $fileBuffer, $fileOffset ); $inFile->open ( "<$sourceFile" ) or die "Could not open $sourceFile:$!\n"; $inMD5->addfile ( $inFile ); print $inMD5->b64digest , "\n"; $outFile->open ( "+>$destFile" ) or die "Could not open $destFile:$!\n"; # borrowed from "Programming Perl" die "Could not rewind $sourceFile: $!" unless defined sysseek $inFile, + 0, 0; my $blockSize = ( stat $inFile )[11] || 16384; while ( $fileLength = sysread $inFile, $fileBuffer, $blockSize ) { if ( !defined $fileLength ) { next if $! =~ /^Interrupted/; die "System read error: $!\n"; } my $fileOffset = 0; while ( $fileLength ) { my $written = syswrite $outFile, $fileBuffer, $fileLength, $fileOffse +t; die "System write error: $!\n" unless defined $written; $fileLength -= $written; $fileOffset += $written; }; } die "Could not rewind $destFile: $!" unless defined sysseek $outFile, +0, 0; $outMD5->addfile ( $outFile ); print $outMD5->b64digest , "\n"; $inFile->close; $outFile->close;
    Moreover, the documented behaviour of an automagical reset right after the digest, seems not to work, at least on b64digest and my system. Something to watch for.
      Works like a charm! A few questions to help illuminate my mind, if I may.

      I'm looking at the perlfunc entry for open, and I remain a little hazy regarding the subtle difference between ">" truncating and "+>" clobbering. I'm digging through the holy texts and references now, but if you care to pass more wisdom my way ...

      The sysseek is a nice touch. I take it that since $outFile was not at the beginning of the file when I passed the filehandle to Digest::MD5, it somehow changed the hashing algorithm's output? Like only hashing from the current position to the end?

      THX!
      Dex

        Dex,

        I actually had to look it up myself (Shhh... don't tell anybody). The + modifies the > or < redirections to 'both ways'. That means, '+>' first opens for writing, but allows reading as well. So you start with an empty file, guaranteed. '+<' the other way around.

        Your 2nd question: Yes. With the remark that you're already at the end, so there is very little to hash on ;-).

        Cheers

        Jeroen

        "We are not alone"(FZ)