我在具有以下结构的站点上有compressed_file.zip :
我想将version_1.x文件夹中的所有内容提取到我的根文件夹:
我怎样才能做到这一点?没有递归是可能的吗?
我在具有以下结构的站点上有compressed_file.zip :
我想将version_1.x文件夹中的所有内容提取到我的根文件夹:
我怎样才能做到这一点?没有递归是可能的吗?
这是可能的,但您必须自己使用以下方式读取和写入文件ZipArchive::getStream
:
$source = 'version_1.x';
$target = '/path/to/target';
$zip = new ZipArchive;
$zip->open('myzip.zip');
for($i=0; $i<$zip->numFiles; $i++) {
$name = $zip->getNameIndex($i);
// Skip files not in $source
if (strpos($name, "{$source}/") !== 0) continue;
// Determine output filename (removing the $source prefix)
$file = $target.'/'.substr($name, strlen($source)+1);
// Create the directories if necessary
$dir = dirname($file);
if (!is_dir($dir)) mkdir($dir, 0777, true);
// Read from Zip and write to disk
$fpr = $zip->getStream($name);
$fpw = fopen($file, 'w');
while ($data = fread($fpr, 1024)) {
fwrite($fpw, $data);
}
fclose($fpr);
fclose($fpw);
}
查看extractTo
. 示例 1。
使用@netcoder 的解决方案时,我遇到了与@quantme 类似的错误。我对该解决方案进行了更改,它可以正常工作,没有任何错误。
$source = 'version_1.x';
$target = '/path/to/target';
$zip = new ZipArchive;
if($zip->open('myzip.zip') === TRUE) {
for($i = 0; $i < $zip->numFiles; $i++) {
$name = $zip->getNameIndex($i);
// Skip files not in $source
if (strpos($name, "{$source}/") !== 0) continue;
// Determine output filename (removing the $source prefix)
$file = $target.'/'.substr($name, strlen($source)+1);
// Create the directories if necessary
$dir = dirname($file);
if (!is_dir($dir)) mkdir($dir, 0777, true);
// Read from Zip and write to disk
if($dir != $target) {
$fpr = $zip->getStream($name);
$fpw = fopen($file, 'w');
while ($data = fread($fpr, 1024)) {
fwrite($fpw, $data);
}
fclose($fpr);
fclose($fpw);
}
}
$zip->close();
}