转:MD5检查程序代码 (perl)

使用了两个不同的函数,在执行效率上checkmd5sum.pl 比checkmd5sum_find.pl要更快。

 

1.checkmd5sum.pl #!/usr/bin/perl # # File: checkmd5sum.pl # Author: amxku.net # Date: 2008-12- ...
两个使用了不同的函数,在执行效率上checkmd5sum.pl 比checkmd5sum_find.pl要更快。
1.checkmd5sum.pl

#!/usr/bin/perl     
# File: checkmd5sum.pl   
# Author: amxku.net   
# Date: 2008-12-02   
# License: GPL-2   
  
use Digest::MD5;   
use IO::File;   
use POSIX qw(strftime);   
  
if( @ARGV != 1 ){   
     print "check files md5sum/nusage:<rootdir>/nexample:c://n";   
     exit;   
}   
  
$now_time=strftime "%Y-%m-%d %H:%M:%S", localtime;   
$md5sumfile_name=strftime "%Y_%m_%d_%H_%M_%S", localtime;   
  
open MD5FILE,">$md5sumfile_name.txt" or die "$!/n/n";   
print MD5FILE "# check files md5sum/n/n";   
print MD5FILE "# Created on $now_time/n";   
print MD5FILE "# amxku_at_msn.com/n/n";   
my $root = $ARGV[0];   
sub lsr_s($) {   
     my $cwd = shift;   
     my @dirs = ($cwd.'/');   
  
     my ($dir, $file);   
     while ($dir = pop(@dirs)) {   
         local *DH;   
         if (!opendir(DH, $dir)) {   
             warn "Cannot opendir $dir: $! $^E";   
             next;   
         }   
         foreach (readdir(DH)) {   
             if ($_ eq '.' || $_ eq '..') {   
                 next;   
             }   
             $file = $dir.$_;            
             if (!-l $file && -d _) {   
                 $file .= '/';   
                 push(@dirs, $file);   
             }   
             process($file, $dir);   
         }   
         closedir(DH);   
     }   
}   
  
my ($size, $dircnt, $filecnt) = (0, 0, 0);   
  
sub process($$) {   
     my $file = shift;   
     print $file, "/n";   
     if (substr($file, length($file)-1, 1) eq '/') {   
         $dircnt++;   
     }   
     else {   
         $filecnt++;   
         $size += -s $file;   
         my $fileinfo = genchksuminfo($file);   
         print MD5FILE "$fileinfo/n";   
     }   
}   
  
sub genchksuminfo   
{   
     my ($file) = @_;   
     my $chk = Digest::MD5->new();   
     my (@statinfo) = stat($file);   
     $chk->add(@statinfo[0,1,2,3,4,5,7,9,10]);   
     $chk->addfile(IO::File->new($file));   
     return sprintf("md5:%s/t%s",$chk->hexdigest,$file);   
}   
  
lsr_s("$root");   
print "/n$filecnt files, $dircnt directory. $size bytes./n";   
my $dateinfo ="/n$filecnt files, $dircnt directory. $size bytes./n";   
print MD5FILE "$dateinfo/n";   
close(MD5FILE);  
2.checkmd5sum_find.pl

#!/usr/bin/perl   
#   
# File: checkmd5sum_find.pl  
# Author: p0150 & amxku   
# License: GPL-2   
  
use File::Find;   
use Digest::MD5;   
use IO::File;   
use POSIX qw(strftime);   
  
if( @ARGV != 1 ){   
     print "usage:   <rootdir>   /n";   
     print "example:    c:/      /n";   
      exit;   
}   
$now_time=strftime "%Y-%m-%d %H:%M:%S", localtime;   
$now_string=strftime "%Y_%m_%d_%H_%M_%S", localtime;   
  
open MD5FILE,">$now_string.txt" or die "$!/n";   
print MD5FILE "#/n";   
print MD5FILE "# Created on $now_time/n";   
print MD5FILE "#/n";   
print MD5FILE "/n";   
chomp(my $dir=$ARGV[0]);   
find(/&wanted, $dir);          
sub wanted   
{   
unless (-d $_)   
{   
print $File::Find::dir.'/'.$_."/n";   
my $name=$File::Find::dir.'/'.$_;   
my $fileinfo = genchksuminfo($name);   
print MD5FILE "$fileinfo/n";   
}   
}   
  
sub genchksuminfo   
{   
     my ($file) = @_;   
     my $chk = Digest::MD5->new();   
     my (@statinfo) = stat($file);   
     $chk->add(@statinfo[0,1,2,3,4,5,7,9,10]);   
     $chk->addfile(IO::File->new($file));   
     return sprintf("md5:%s/t%s",$chk->hexdigest,$file);   
}   
close(MD5FILE);  

 

 

 原文来自链接:http://www.hackbase.com/tech/2009-11-03/57649.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值