效果
保持目录结构,压缩整个文件夹为zip包
完整代码
<?php
/**
* 压缩整个文件夹为zip文件
*/
function make_zip_file_for_folder ($zip_path = '', $folder_path = '') {
// Get real path for our folder
$rootPath = realpath($folder_path);
// Initialize archive object
$zip = new ZipArchive();
$zip->open($zip_path, ZipArchive::CREATE | ZipArchive::OVERWRITE);
// Create recursive directory iterator
/** @var SplFileInfo[] $files */
$files = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($rootPath),
RecursiveIteratorIterator::LEAVES_ONLY
);
foreach ($files as $name => $file)
{
// Skip directories (they would be added automatically)
if (!$file->isDir())
{
// Get real and relative path for current file
$filePath = $file->getRealPath();
$relativePath = substr($filePath, strlen($rootPath) + 1);
// Add current file to archive
$zip->addFile($filePath, $relativePath);
}
}
// Zip archive will be created only after closing object
$zip->close();
}
使用方法
$zip_file = '/var/www/abc.zip';
$zip_dir = '/var/www/abc/';
make_zip_file_for_folder($zip_file, $zip_dir);
思路
RecursiveIteratorIterator 递归获取文件树(列表)
$zip->addFile($filePath, $relativePath); 逐个添加文件到zip压缩包
感谢
代码来自大佬:https://www.cnblogs.com/eleven24/p/10836407.html
封面
更多 (凑字数专用)
看名字就知道,RecursiveIteratorIterator是个递归迭代器,其后可选带四个参数(只能任一)
RecursiveIteratorIterator::LEAVES_ONLY
默认,已在__construct中设定使用
作用是去枝留叶,跳过空节点,只递归取实值
举例就是
1.递归文件夹取文件时跳过文件夹本身,只取文件夹下面的文件,输出的项全部是file(文件和各级子文件夹的文件)
2.多维数组就跳过前几维的key,而取value,输出的每一项都不是array
3.XML只取值(text),不输出节点名,当然还要视乎你设定获取xml什么内容
RecursiveIteratorIterator::SELF_FIRST
各项都包含,例如递归文件夹就会连同子文件夹名称也作为其中项输出,顺序是先父后子
RecursiveIteratorIterator::CHILD_FIRST
同上,但顺序是先子后父,./test/test.php会在./test(文件夹)前面
RecursiveIteratorIterator::CATCH_GET_CHILD
未明,测试结果和LEAVES_ONLY一样,估计是只取子项。