Zip
在线手册:中文 英文
PHP手册

The ZipArchive class

(No version information available, might only be in SVN)

简介

A file archive, compressed with Zip.

类摘要

ZipArchive {
/* 属性 */
/* 方法 */
bool addEmptyDir ( string $dirname )
bool addFile ( string $filename [, string $localname = NULL [, int $start = 0 [, int $length = 0 ]]] )
bool addFromString ( string $localname , string $contents )
bool close ( void )
bool deleteIndex ( int $index )
bool deleteName ( string $name )
bool extractTo ( string $destination [, mixed $entries ] )
string getArchiveComment ([ int $flags ] )
string getCommentIndex ( int $index [, int $flags ] )
string getCommentName ( string $name [, int $flags ] )
mixed getFromIndex ( int $index [, int $length = 0 [, int $flags ]] )
mixed getFromName ( string $name [, int $length = 0 [, int $flags ]] )
string getNameIndex ( int $index [, int $flags ] )
string getStatusString ( void )
resource getStream ( string $name )
mixed locateName ( string $name [, int $flags ] )
mixed open ( string $filename [, int $flags ] )
bool renameIndex ( int $index , string $newname )
bool renameName ( string $name , string $newname )
mixed setArchiveComment ( string $comment )
mixed setCommentIndex ( int $index , string $comment )
mixed setCommentName ( string $name , string $comment )
mixed statIndex ( int $index [, int $flags ] )
mixed statName ( name $name [, int $flags ] )
mixed unchangeAll ( void )
mixed unchangeArchive ( void )
mixed unchangeIndex ( int $index )
mixed unchangeName ( string $name )
}

属性

status

Status of the Zip Archive

statusSys

System status of the Zip Archive

numFiles

Number of files in archive

filename

File name in the file system

comment

Comment for the archive

Table of Contents


Zip
在线手册:中文 英文
PHP手册
PHP手册 - N: The ZipArchive class

用户评论:

webmaster at sebastiangrinke dot info (06-Oct-2011 09:30)

Here is a simple function which zips folders with all sub folders or only a simple file... the $data var can be a string or an array...

<?php
public function un_zip($data,$arcpf,$mode='zip',$obj=''){
       
$absoluterpfad = 'YOUR_BASE_PATH';
       
$arcpf = $absoluterpfad.DS.$arcpf;
        if(
is_object($obj)==false){
            
$archiv = new ZipArchive();
            
$archiv->open($arcpf,ZipArchive::CREATE);
        }else{
$archiv =& $obj;}
        if(
$mode=='zip'){
           if(
is_array($data)==true){
                 foreach(
$data as $dtmp){
                    
$archiv =& un_zip($dtmp,$arcpf,'zip',&$archiv);
                 }
           }else{
            if(
is_dir($data)==true){
                   
$archiv->addEmptyDir(str_replace($absoluterpfad.DS,'',$data));
                 
$files = scandir($data);
              
$bad = array('.','..');
              
$files = array_diff($files,$bad);
               foreach(
$files as $ftmp){
                   if(
is_dir($data.DS.$ftmp)==true){
                       
$archiv->addEmptyDir(str_replace($absoluterpfad.DS,'',$data.'/'.$ftmp));
                       
$archiv =& un_zip($data.DS.$ftmp,$arcpf,'zip',&$archiv);
                   }elseif(
is_file($data.DS.$ftmp)==true){
                   
$archiv->addFile($data.DS.$ftmp,str_replace($absoluterpfad.DS,'',$data.'/'.$ftmp));
                   }
                 }
            }elseif(
is_file($data)==true){$archiv->addFile($data,str_replace($absoluterpfad.DS,'',$data));}
           }
        }
        if(
is_object($obj)==false){$archiv->close();}
        else{return
$archiv;}
        if(
$mode=='unzip'){$archiv->extractTo($data);}
    }
?>

Jerry dot Saravia at emc dot com (08-Aug-2011 09:57)

The following code can be used to get a list of all the file names in a zip file.

<?php
$za
= new ZipArchive();

$za->open('theZip.zip');

for(
$i = 0; $i < $za->numFiles; $i++ ){
   
$stat = $za->statIndex( $i );
   
print_r( basename( $stat['name'] ) . PHP_EOL );
}
?>

anonymous at example dot net (29-Jul-2011 07:18)

status - libzip error code (ER_*)
statusSys - copy of errno (E*) or zlib error code

ER_OK           N No error
ER_MULTIDISK    N Multi-disk zip archives not supported
ER_RENAME       S Renaming temporary file failed
ER_CLOSE        S Closing zip archive failed
ER_SEEK         S Seek error
ER_READ         S Read error
ER_WRITE        S Write error
ER_CRC          N CRC error
ER_ZIPCLOSED    N Containing zip archive was closed
ER_NOENT        N No such file
ER_EXISTS       N File already exists
ER_OPEN         S Can't open file
ER_TMPOPEN      S Failure to create temporary file
ER_ZLIB         Z Zlib error
ER_MEMORY       N Malloc failure
ER_CHANGED      N Entry has been changed
ER_COMPNOTSUPP  N Compression method not supported
ER_EOF          N Premature EOF
ER_INVAL        N Invalid argument
ER_NOZIP        N Not a zip archive
ER_INTERNAL     N Internal error
ER_INCONS       N Zip archive inconsistent
ER_REMOVE       S Can't remove file
ER_DELETED      N Entry has been deleted

h-fate at gmx dot net (05-Oct-2010 12:17)

Be wary that there are several algorithms to generate a zip file. I found that Office OpenXML files created with ZipArchive are not recognized by Excel 2007, for example.

You have to use a different class to zip in this case, such as PclZip.

hardcorevenom at gmx dot com (15-Jun-2010 11:17)

Read a file from an archive to a variable.
A warning is printed automatically in case of a CRC32 mismatch, which we capture, so we can print our own error message.

<?php
$zip
= new ZipArchive();
if (
$zip->open('archive.zip')) {
 
$fp = $zip->getStream('myfile.txt'); //file inside archive
 
if(!$fp)
    die(
"Error: can't get stream to zipped file");
 
$stat = $zip->statName('myfile.txt');

 
$buf = ""; //file buffer
 
ob_start(); //to capture CRC error message
   
while (!feof($fp)) {
     
$buf .= fread($fp, 2048); //reading more than 2156 bytes seems to disable internal CRC32 verification (bug?)
   
}
   
$s = ob_get_contents();
 
ob_end_clean();
  if(
stripos($s, "CRC error") != FALSE){
    echo
'CRC32 mismatch, current ';
   
printf("%08X", crc32($buf)); //current CRC
   
echo ', expected ';
   
printf("%08X", $stat['crc']); //expected CRC
 
}

 
fclose($fp);
 
$zip->close();
 
//Done, unpacked file is stored in $buf
}
?>

To create a corrupt file, change a byte in a zip file using a hex editor.