Diretório de extrato dentro do código postal

Estou escrevendo um script para extrair arquivos de um arquivo zip para o diretório que o script está localizado.

Aqui está o meu código:

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

Isso funciona bem, mas há um problema. O zip contém uma camada extra. (zip / diretório / arquivos) que extrai como este diretório / arquivos em vez de apenas os arquivos.

Existe uma maneira de remover essa camada extra?

Obrigado pela ajuda!

Joel Drapper

Para evitar que qualquer arquivo seja substituído, você provavelmente deseja extrair o arquivo zip em um diretório primeiro. Eu criaria um diretório com um nome random, extrai o zip para aquele diretor e depois verificaria se há subdiretórios:

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

Eu não testei esse código, então, use por sua conta e risco, também, talvez não funcione como pretendido nos sistemas Windows. Além disso, confira a documentação para todas as funções que usei:

  • Tempo()
  • glob ()
  • opendir ()
  • readdir ()
  • renomear ()