2012-05-21 75 views
4

我目前正在研究一种上传一组文件的工具,然后使用md5校验和将文件与最后一批上传的文件进行比较,并告诉您哪些文件已更改。zip文件的校验和

对于普通文件,这工作正常,但一些上传的文件是zip档案,即使其中的文件是相同的,它几乎总是变化。

有没有办法执行不同类型的校验和来检查这些文件是否发生了变化,而不必单独解压每个文件,然后逐个比较每个文件的内容。

这里是我当前的功能

function check_if_changed($date, $folder, $filename) 
{ 
    $dh = opendir('./wp-content/uploads/Base/'); 
    while (($file = readdir($dh)) !== false) { 
    $folders[] = $file; 
    } 
    sort($folders); 
    $position = array_search($date, $folders); 
    $prev_folder = $folders[$position - 1]; 
    if ($prev_folder == '.' || $prev_folder == '..') 
    { return true;} 
    $newhash = md5_file('./wp-content/uploads/Base/'.$date.'/'.$folder.'/'.$filename); 
    $oldhash = md5_file('./wp-content/uploads/Base/'.$prev_folder.'/'.$folder.'/'.$filename); 
    if ($oldhash != $newhash){ 
    return true; 
    } 
    return false; 
} 

回答

5

在一个zip压缩文件中,每个“文件”都与元数据一起存储,如最后一次修改时间,文件名,文件大小等等,以及重要部分 - 一个crc32校验和

基本上,您可以在二进制文件中以二进制方式操作,查找每个文件的元数据头并将校验和与先前存储的校验和进行比较。您无需进行任何解压即可访问zip存档中的元数据。这将非常快速。

http://en.wikipedia.org/wiki/Zip_(file_format)

编辑 - 实际上,ZipArchive提供了这个功能。请参阅: http://www.php.net/manual/en/ziparchive.statindex.php

+0

OT:python zip库允许您从zip文件中抓取crcs,您还可以使用binascii模块为任意任意数据计算它。 –

+0

看起来校验和是'crc32b',它可以由'$ newCrc = hexdec(hash_file(“crc32b”,“myPath /”。$ name));'在64位机器上生成。 –

0

你可以只提取ZIP文件的文件部分,然后散列他们,但那么你就必须删除元信息,太!

所以提取文件是最简单的解决方案。