我正在编写一个脚本,将 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) 会像这样提取目录/文件,而不仅仅是文件。
有没有办法去除这个额外的层?
感谢您的帮助!
乔尔·德雷珀
为了防止任何文件被覆盖,您可能需要首先将 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 系统上按预期工作。此外,请查看我使用的所有函数的文档:
- time() http://php.net/time
- glob() http://php.net/glob
- 打开目录() http://php.net/opendir
- 读目录() http://php.net/readdir
- rename() http://php.net/rename
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)