Zip İç Directory Özü

1 Cevap php

Ben komut dosyasının bulunduğu dizine bir zip arşiv dosyaları ayıklamak için bir komut dosyası yazıyorum.

İşte benim kod:

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

Bu iyi çalışır, ama bir sorun var. Zip fazladan bir katman içerir. Sadece dosyaları ziyade bu dizini / dosyaları gibi ayıklar (zip / dizin / dosyalar).

Bu ekstra katmanı kaldırmak için bir yolu var mı?

Yardımlarınız için teşekkürler!

Joel Drapper

1 Cevap

Üzerine getting herhangi bir dosya önlemek için, muhtemelen ilk bir dizine zip dosyasını ayıklamak istiyorum. Ben, rasgele bir isim ile bir dizin oluşturmak yönetmen içine zip ayıklamak ve daha sonra herhangi bir alt dizinleri kontrol ediyorum:

<?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>/"
}

Ben bu kodu test değil, bu nedenle, Windows sistemlerinde amaçlanan olarak kendi risk kullanımı, aynı zamanda, işe yarayabilir. Ayrıca, ben kullanılan tüm fonksiyonları için belgelerine göz atın: