ZipArchive
在线手册:中文  英文

ZipArchive::statIndex

(PHP 5 >= 5.2.0, PECL zip >= 1.1.0)

ZipArchive::statIndexGet the details of an entry defined by its index.

说明

array ZipArchive::statIndex ( int $index [, int $flags ] )

The function obtains information about the entry defined by its index.

参数

index

Index of the entry

flags

ZipArchive::FL_UNCHANGED may be ORed to it to request information about the original file in the archive, ignoring any changes made.

返回值

Returns an array containing the entry details 或者在失败时返回 FALSE.

范例

Example #1 Dump the stat info of an entry

<?php
$zip 
= new ZipArchive;
$res $zip->open('test.zip');
if (
$res === TRUE) {
    
print_r($zip->statIndex(3));
    
$zip->close();
} else {
    echo 
'failed, code:' $res;
}
?>

以上例程的输出类似于:

Array
(
    [name] => foobar/baz
    [index] => 3
    [crc] => 499465816
    [size] => 27
    [mtime] => 1123164748
    [comp_size] => 24
    [comp_method] => 8
)

ZipArchive
在线手册:中文  英文

用户评论:

Chris Lewis (2011-12-20 00:15:26)

Note that the signed-integer CRC result is only true on 32-bit systems. 64-bit systems return correct CRCs.
A safer way (as recommended by crc32() function page) might be:
if ($file['crc'] < 0)
$file['crc'] = sprintf("%u",$file['crc']);

Anonymous (2011-11-16 08:20:27)

The CRC returned from this method is a signed number and so can be negative. This isn't how most CRC's are represented and so can cause problems. Another thing to know is that the standerd CRC algorithm used for zip files is CRC32b. 

So to put this together lets say that you wanted to extract the first file from a zip and then compare the original CRC with the CRC for the extracted file this is what you would need to do. (proper error checking is omitted for simplicity). 

<?php
 $zip 
= new ZipArchive();

 
$zip->open("myZip.zip");

 
$stat $zip->statIndex);

 
$name $stat['name'];

 
$oldCrc $stat['crc'];

 
$zip->extractTo("myPath"$name);

 
$newCrc hexdec(hash_file("crc32b""myPath/" $name));

 
// Have to test both cases as the unsigned CRC from within the zip might appear negative as a signed int. 
 
if($newCrc !== $oldCrc && ($oldCrc 4294967296) !== $newCrc) {
    echo 
"The files don't match!";
 }
?>

易百教程