note 91221 modified in function.ziparchive-addemptydir by danbrown

From: Date: Fri, 12 Jun 2009 22:20:29 +0000
Subject: note 91221 modified in function.ziparchive-addemptydir by danbrown
References: 1  Groups: php.notes 
Request: Send a blank email to php-notes+get-156828@lists.php.net to get a copy of this message
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(); ?> --was-- 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.= '/'; } $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(); ?> http://php.net/manual/en/function.ziparchive-addemptydir.php

« previous php.notes (#156828) next »