首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ZipArchive无法解压缩ZipArchive压缩的文件

ZipArchive无法解压缩ZipArchive压缩的文件
EN

Stack Overflow用户
提问于 2014-02-25 16:36:15
回答 1查看 3.6K关注 0票数 2

试图获得导入/导出功能。

  1. 包含文件的文件夹
  2. 使用ZipArchive压缩PHP中的文件夹
  3. 使用ZipArchive解压缩压缩文件夹
  4. 创建了新文件夹,但里面的文件丢失了。 函数unArchive(){ $zip =新ZipArchive;$res = $zip->open('zipTest.zip');if ($res === TRUE) { echo 'ok';$zip-> echo (“testfolder2”);$zip->close();}$res{echo 'failed,code:‘。}函数zip( $res;}函数Zip( $source,$destination){ if (!extension_loaded('zip') new !file_exists($source)){返回false;} $zip =新ZipArchive();if (!$zip->open($destination,ZIPARCHIVE::CREATE)) {返回false;}$source= str_replace('\','/',realpath($source));if (is_dir($source) === true){ $files =新RecursiveIteratorIterator(新RecursiveDirectoryIterator($source),RecursiveIteratorIterator::SELF_FIRST);foreach ($files as $file){ $file = str_replace('\','/',realpath($file));if (is_dir($file) === true){ $zip->addEmptyDir( ===)。'/','',$file。}else (is_file($file) === true){ $zip->addFromString( str_replace($source )。'/','',$file),file_get_contents($file );}{is_file($source) === true){ $zip->addFromString(basename($source),file_get_contents($source));}返回$zip->close();} Zip(“test文件夹/”,"./zipTest.zip“);unArchive();

对于单个文件,代码工作正常。通过使用ZipArchive压缩文件,我可以使用WinRAR手动解压缩,然后使用WinRAR重新压缩,然后ZipArchive可以成功地解压缩该文件。问题是,ZipArchive不会提取它直接压缩的存档。我还可以在Notepad++中看到,ZipArchive压缩与WinRAR压缩不同,文件大小也不同。我可以在php中成功地将winrar作为系统命令调用,以获得所需的功能,但这似乎是个坏主意。ZipArchive创建无法解压缩的压缩文件有什么原因吗?

错误消息: ZipArchive::extractTo():在$zip->extractTo(“testfolder2”)行中的文件中的无效参数;

EN

回答 1

Stack Overflow用户

发布于 2014-09-10 12:41:52

RecursiveIteratorIterator返回伪文件“。这很重要,"..“-父目录。当您使用addEmptyDir添加父目录时,ZipArchive将添加它(以某种方式)!您甚至可以尝试“$zip->addEmptyDir(”./某某“)”,它不会抱怨。

现在,通常来说,zip文件并不是这样的。解压缩它们时,您希望所有内容都在您解压缩的文件夹中,而不是在父文件夹中。这就是为什么普通的ZIP提取程序没有显示出来。

然而,PHP甚至会提取这些文件夹。然后,将以某种方式出现此错误,因为您试图包含“”。或者“.”目录。

在foreach循环开始时添加此内容以解决此问题:

代码语言:javascript
复制
if (basename($file) === ".") { continue;}
if (basename($file) === "..") { continue; }

测试用例:

代码语言:javascript
复制
<?php
$archive = new ZipArchive();
$archive->open('c.zip',ZipArchive::CREATE);
$archive->addFile('a.txt');
$archive->addFile('b.txt');
$archive->addEmptyDir("../../down");
$archive->close();

$archive2 = new ZipArchive();
$archive2->open('c.zip');
$archive2->extractTo('here');
$archive2->close();

我只在Windows上测试过这个。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22020437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档