【发布时间】:2015-06-02 19:35:27
【问题描述】:
我正在使用一个前雇员创建的 PHP zip 函数。它压缩文件和文件夹,但生成的 ZIP 文件有两个问题:
一个。它不包括“主”文件夹
湾。它不保留父/子文件夹结构
我想要的是将子文件夹放在父文件夹下,如下所示:
Parent1
+-- Child1a
+-- Child1b
Parent2
Parent3
+-- Child3a
+-- Subchild3a1
+-- Subchild3a2
但我最终得到的是 ZIP 文件中的平面文件夹结构:
Parent1
Child1a
Child1b
Parent2
Parent3
Child3a
Subchild3a1
Subchild3a2
如何使用以下代码解决此问题:
<?php
function folderToZip($folder, &$zipFile, $subfolder = null) {
if ($zipFile == null) {
return false;
}
$folder .= end(str_split($folder)) == "/" ? "" : "/";
$subfolder .= end(str_split($subfolder)) == "/" ? "" : "/";
$handle = opendir($folder);
while ($f = readdir($handle)) {
if ($f != "." && $f != ".." && $f != "archive") {
if (is_file($folder . $f)) {
if ($subfolder != null)
$zipFile->addFile($folder . $f, $subfolder . $f);
else
$zipFile->addFile($folder . $f);
} elseif (is_dir($folder . $f)) {
$zipFile->addEmptyDir($f);
folderToZip($folder . $f, $zipFile, $f);
}
}
}
}
?>
<?php
$z = new ZipArchive();
$z->open("test.zip", ZIPARCHIVE::CREATE);
folderToZip("c:/path/to/look/for/files/to/compress/", $z);
echo "<br />Done";
$z->close();
$ex_file = "./archive/back-" . date('Ymd_Hi', time()) . ".zip";
rename("test.zip", $ex_file);
?>
编辑:这是最终对我有用的脚本:
<?php
function folderToZip($folder, $zipFile, $subfolder = null) {
if ($zipFile == null) {
return false;
}
$folder .= end(str_split($folder)) == "/" ? "" : "/";
$subfolder .= end(str_split($subfolder)) == "/" || $subfolder == NULL ? "" : "/";
$handle = opendir($folder);
while ($f = readdir($handle)) {
if ($f != "." && $f != ".." && $f != "archive") {
if (is_file($folder . $f)) {
$zipFile->addFile($folder . $f, $subfolder . $f);
} elseif (is_dir($folder . $f)) {
$zipFile->addEmptyDir($subfolder . $f);
folderToZip($folder . $f, $zipFile, $subfolder . $f);
}
}
}
}
?>
<?php
$z = new ZipArchive();
$z->open("test.zip", ZIPARCHIVE::CREATE);
folderToZip("c:/path/to/look/for/files/to/compress/", $z);
echo "<br />Done";
$z->close();
$ex_file = "./archive/back-" . date('Ymd_Hi', time()) . ".zip";
rename("test.zip", $ex_file);
?>
【问题讨论】:
-
ZIP 中是否创建了目录? (最好通过在输出中的任何目录后添加 / 来指定它们,即
Parent1/) -
是的,正在创建文件夹,但它们都在同一个父级别。文件夹内有文件 - 除了“主”文件夹中的文件。
标签: php