我正在寻找在 Perl 中获取文件校验和的方法,但不是通过执行系统命令cksum
——我想在 Perl 本身中进行,因为脚本需要在 UNIX 和 Windows 之间移植。cksum <FILENAME> | awk '{ print $1 }'
适用于 UNIX,但显然不适用于 Windows。我已经探索过MD5,但似乎获取文件句柄是必要的,而且通常它似乎不是一种非常紧凑的获取数据的方法(最好是单行)。
有没有更好的办法?
以下是三种不同的方式,具体取决于您可用的模块:
use Digest::MD5 qw(md5_hex);
use File::Slurp;
print md5_hex(read_file("filename")), "\n";
use IO::All;
print md5_hex(io("filename")->all), "\n";
use IO::File;
print md5_hex(do { local $/; IO::File->new("filename")->getline }), "\n";
不完全是一条线,但非常接近。
替换Digest::MD5
为您想要的任何哈希算法,例如 SHA1。
IO::File
是核心,应该随处可用,但这是我个人最不喜欢的解决方案。无论如何,它有效。
我无法在 Windows 中为我完成上述任何工作,我总是会得到一个不正确的 MD5。我怀疑它是由换行符的差异引起的,但是将文件转换为 DOS 或 unix 没有任何区别。具有相同文件的相同代码将在 linux 上给我正确的答案,而在 windows 中给我错误的答案。阅读文档,我终于找到了适用于 windows 和 linux 的东西:
use Digest::MD5;
open ($fh, '<myfile.txt');
binmode ($fh);
print Digest::MD5->new->addfile($fh)->hexdigest;
我希望这可以帮助其他在 Windows 上遇到困难的人,我觉得这很奇怪,以至于我没有发现任何关于 Windows 问题的提及......
这也有效:
use Digest::MD5 qw(md5_base64);
...
open(HANDLE, "<", $dirItemPath);
my $cksum = md5_base64(<HANDLE>);
print "\nFile checksum = ".$cksum;