提取Zip内部的目录

时间:2009-05-13 17:49:42

标签: php directory zip extract archive

我正在编写一个脚本,用于将zip存档中的文件解压缩到脚本所在的目录中。

这是我的代码:

$zip = new ZipArchive;
if ($zip->open('latest.zip') === TRUE) {
    $zip->extractTo('.');
    $zip->close();
    unlink('installer.php');
    echo 'it works!';
} else {
    echo 'failed';
}

这很好用,但有一个问题。拉链包含一个额外的图层。 (zip /目录/文件)提取像这个目录/文件而不是文件。

有没有办法删除这个额外的图层?

感谢您的帮助!

Joel Drapper

1 个答案:

答案 0 :(得分:2)

为了防止任何文件被覆盖,您可能希望首先将zip文件解压缩到目录中。我创建一个带有随机名称的目录,将zip解压缩到该director中,然后检查所有子目录:

<?php

// Generate random unzip directory to prevent overwriting
// This will generate something like "./unzip<RANDOM SEQUENCE>"
$pathname = './unzip'.time().'/';

if (mkdir($pathname) === TRUE) {

  $zip = new ZipArchive;

  if ($zip->open('latest.zip') === TRUE) {

    $zip->extractTo($pathname);

    // Get subdirectories
    $directories = glob($pathname.'*', GLOB_ONLYDIR);

    if ($directories !== FALSE) {

      foreach($directories as $directory) {

        $dir_handle = opendir($directory);

        while(($filename = readdir($dir_handle)) !== FALSE) {

          // Move all subdirectory contents to "./unzip<RANDOM SEQUENCE>/"
          if (rename($filename, $pathname.basename($filename)) === FALSE) {
            print "Error moving file ($filename) \n";
          }
        }
      }
    }

    // Do whatever you like here, for example:
    unlink($pathname.'installer.php');

  }

  // Clean up your mess by deleting "./unzip<RANDOM SEQUENCE>/"
}

我没有测试过这段代码,因此,使用风险自负,也可能无法在Windows系统上运行。另外,查看我使用的所有功能的文档: