我有一个允许用户上传ZIP文件夹的脚本。有些用户选择单个文件,然后将其压缩,以便在解压缩时有多个文件,但有些ZIP整个文件夹,所以当它们未压缩时,你只需要一个文件夹。
我想要做的是检查解压缩文件夹的唯一内容是否是另一个文件夹,如果是,则将该文件夹中的所有文件向下移动到上一个文件夹中,然后删除原始文件夹。
这样做的最佳方式是什么?
答案 0 :(得分:0)
换句话说,您想要展平zip存档的目录结构。有很多方法可以做到这一点。
解压缩,然后展平文件夹结构
一种方法是解压缩zip存档,然后使用DirectoryIterator来处理文件和文件夹。 如果检测到文件夹,则将其文件内容移动/复制到提取目录,然后删除该文件夹。这会使文件夹上的每次迭代都会使dir结构变平。
https://stackoverflow.com/a/17087268/1163786
ZipArchive - 无文件夹解压缩
另一种方法是解压缩zip存档,而不必关心存储在其中的路径,如下所示:
$path = 'zipfile.zip'
$zip = new ZipArchive;
if ($zip->open($path) === true) {
for($i = 0; $i < $zip->numFiles; $i++) {
$filename = $zip->getNameIndex($i);
$fileinfo = pathinfo($filename);
copy("zip://".$path."#".$filename, "/your/new/destination/".$fileinfo['basename']);
}
$zip->close();
}
unzip -j或7z -e
最后,它被标记为PHP问题,但是:
如果在CLI上使用unzip
,请使用-j
选项。
Ìt代表“垃圾路径”,这意味着当解压缩并且所有文件都存储在提取目录中时(默认情况下,当前的文件),不会重新创建存档的目录结构。
在e
上x
(忽略路径),而不是7z
(带完整路径)。 http://sevenzip.sourceforge.jp/chm/cmdline/commands/extract.htm