Извлечь каталог внутри Zip - PullRequest
3 голосов
/ 13 мая 2009

Я пишу скрипт для извлечения файлов из zip-архива в каталог, в котором находится скрипт.

Вот мой код:

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

Это отлично работает, но есть одна проблема. Почтовый индекс содержит дополнительный слой. (zip / directory / files), который извлекает как этот каталог / файлы, а не только файлы.

Есть ли способ удалить этот дополнительный слой?

Спасибо за вашу помощь!

Джоэл Дрэппер

1 Ответ

2 голосов
/ 13 мая 2009

Чтобы предотвратить перезапись любых файлов, вы, вероятно, хотите сначала извлечь zip-файл в каталог. Я бы создал каталог со случайным именем, распаковал бы zip в этот каталог и затем проверил бы наличие любых подкаталогов:

<?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. Кроме того, ознакомьтесь с документацией по всем функциям, которые я использовал:

...