Last 5.3 release ever available: PHP 5.3.29 - 5.3 now EOL

ZipArchive::addEmptyDir

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

ZipArchive::addEmptyDirAñadir un nuevo directorio

Descripción

bool ZipArchive::addEmptyDir ( string $dirname )

Añade un directoro vacío en el archivo.

Parámetros

dirname

El directorio a añadir.

Valores devueltos

Devuelve TRUE en caso de éxito o FALSE en caso de error.

Ejemplos

Ejemplo #1 Crea un nuevo directorio en un archivo

<?php
$zip 
= new ZipArchive;
if (
$zip->open('test.zip') === TRUE) {
    if(
$zip->addEmptyDir('newDirectory')) {
        echo 
'Creado nuevo directorio root';
    } else {
        echo 
'No se puede crear el directorio';
    }
    
$zip->close();
} else {
    echo 
'falló';
}
?>
add a note add a note

User Contributed Notes 6 notes

up
3
hunter666 at abv dot bg
4 years ago
Add folder and sub-directories to zip archive.

<?php
$archive_name
= "archive.zip"; // name of zip file
$archive_folder = "folder"; // the folder which you archivate

$zip = new ZipArchive;
if (
$zip -> open($archive_name, ZipArchive::CREATE) === TRUE)
{
   
$dir = preg_replace('/[\/]{2,}/', '/', $archive_folder."/");
   
   
$dirs = array($dir);
    while (
count($dirs))
    {
       
$dir = current($dirs);
       
$zip -> addEmptyDir($dir);
       
       
$dh = opendir($dir);
        while(
$file = readdir($dh))
        {
            if (
$file != '.' && $file != '..')
            {
                if (
is_file($file))
                   
$zip -> addFile($dir.$file, $dir.$file);
                elseif (
is_dir($file))
                   
$dirs[] = $dir.$file."/";
            }
        }
       
closedir($dh);
       
array_shift($dirs);
    }
   
   
$zip -> close();
    echo
'Archiving is sucessful!';
}
else
{
    echo
'Error, can\'t create a zip file!';
}
?>
up
2
D.Jann
5 years ago
I've brought a little modification to dayjo's code, so it wouldn't re-create the whole structure of your working drive in the zip file:

<?php
// Function to recursively add a directory,
// sub-directories and files to a zip archive
function addFolderToZip($dir, $zipArchive, $zipdir = ''){
    if (
is_dir($dir)) {
        if (
$dh = opendir($dir)) {

           
//Add the directory
           
if(!empty($zipdir)) $zipArchive->addEmptyDir($zipdir);
          
           
// Loop through all the files
           
while (($file = readdir($dh)) !== false) {
          
               
//If it's a folder, run the function again!
               
if(!is_file($dir . $file)){
                   
// Skip parent and root directories
                   
if( ($file !== ".") && ($file !== "..")){
                       
addFolderToZip($dir . $file . "/", $zipArchive, $zipdir . $file . "/");
                    }
                  
                }else{
                   
// Add the files
                   
$zipArchive->addFile($dir . $file, $zipdir . $file);
                  
                }
            }
        }
    }
}
?>

If you don't specify the third parameter (zipdir), the directory you're adding will be added at the root of the zip file.

D.Jann
up
1
pagetronic
5 years ago
addEmptyDir doesn't exist now,
use $zip->addFile($file, $dir.$fichier);

nothing on the net about this,

addEmptyDir work on Ubuntu but not on Debian Etch
up
1
Anonymous
5 years ago
Here's a simple recurring function to add a directory, all sub-directories and all files to an already created zip file;

<?php
// Function to recursively add a directory,
// sub-directories and files to a zip archive
function addFolderToZip($dir, $zipArchive){
    if (
is_dir($dir)) {
        if (
$dh = opendir($dir)) {

           
//Add the directory
           
$zipArchive->addEmptyDir($dir);
           
           
// Loop through all the files
           
while (($file = readdir($dh)) !== false) {
           
               
//If it's a folder, run the function again!
               
if(!is_file($dir . $file)){
                   
// Skip parent and root directories
                   
if( ($file !== ".") && ($file !== "..")){
                       
addFolderToZip($dir . $file . "/", $zipArchive);
                    }
                   
                }else{
                   
// Add the files
                   
$zipArchive->addFile($dir . $file);
                   
                }
            }
        }
    }
}
?>

Would be nice to see more input on these functions :)

Dayjo
up
0
thomas dot rubbert at yahoo dot de
5 years ago
Here's a stack-based way to zip a directory. No recursion, no function, no class:

<?php
$zip
= new ZipArchive();
$zip->open('test.zip', ZipArchive::CREATE);

$dirName = 'test';

if (!
is_dir($dirName)) {
    throw new
Exception('Directory ' . $dirName . ' does not exist');
}

$dirName = realpath($dirName);
if (
substr($dirName, -1) != '/') {
   
$dirName.= '/';
}

/*
* NOTE BY danbrown AT php DOT net: A good method of making
* portable code in this case would be usage of the PHP constant
* DIRECTORY_SEPARATOR in place of the '/' (forward slash) above.
*/

$dirStack = array($dirName);
//Find the index where the last dir starts
$cutFrom = strrpos(substr($dirName, 0, -1), '/')+1;

while (!empty(
$dirStack)) {
   
$currentDir = array_pop($dirStack);
   
$filesToAdd = array();

   
$dir = dir($currentDir);
    while (
false !== ($node = $dir->read())) {
        if ((
$node == '..') || ($node == '.')) {
            continue;
        }
        if (
is_dir($currentDir . $node)) {
           
array_push($dirStack, $currentDir . $node . '/');
        }
        if (
is_file($currentDir . $node)) {
           
$filesToAdd[] = $node;
        }
    }

   
$localDir = substr($currentDir, $cutFrom);
   
$zip->addEmptyDir($localDir);
   
    foreach (
$filesToAdd as $file) {
       
$zip->addFile($currentDir . $file, $localDir . $file);
    }
}

$zip->close();
?>
up
0
benjamin dot seiller at antwerpes dot de
6 years ago
There is kind of a bug in the method
ZipArchive::addFile
which affects the class ZipFolder below.
It is related to the numer of max filehandles of the OS.

As workaround add a file-counter to the class and close + reopen the archive if a certain number of files (directories count as files!) is reached.

For more details see here:
http://de.php.net/manual/en/function.ziparchive-addfile.php
or go directly here
http://bugs.php.net/bug.php?id=40494
or here
http://pecl.php.net/bugs/bug.php?id=9443
To Top