3

zipアーカイブからスクリプトが配置されているディレクトリにファイルを抽出するスクリプトを作成しています。

これが私のコードです:

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

これは正常に機能しますが、1つの問題があります。zipには追加のレイヤーが含まれています。(zip / directory / files)これは、ファイルだけでなく、このディレクトリ/ファイルのように抽出します。

この余分なレイヤーを削除する方法はありますか?

ご協力いただきありがとうございます!

Joel Drapper

4

1 に答える 1

2

ファイルが上書きされるのを防ぐために、最初に 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 システムでは意図したとおりに動作しない可能性があります。さらに、私が使用したすべての関数のドキュメントをチェックしてください。

于 2009-05-13T18:29:23.703 に答える