2014-09-21 8 views
-1

У меня есть сценарий, который позволяет пользователям загружать ZIP-папку. Некоторые пользователи выбирают отдельные файлы и ZIP их, поэтому при несжатом виде есть несколько файлов, однако некоторые ZIP-папки, поэтому, когда они несжаты, вы получаете только одну папку.Проверьте, есть ли у пользователя сжатая папка или файлы

Что я хочу сделать, это проверить, является ли только содержимое распакованной папки другой папкой, и если это так, переместите все файлы из этой папки в предыдущую и удалите исходную папку.

Каким будет лучший способ сделать это?

ответ

0

Другими словами, вы хотите сгладить структуру каталогов 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, но: Если вы используете unzip на CLI, используйте опцию -j. Ìt означает «мусорные пути», что означает, что структура каталогов архива не воссоздается, при распаковке и хранении всех файлов в каталоге извлечения (по умолчанию используется текущий).

Это e (для игнорирования дорожек), вместо x (с полными путями) на 7z. http://sevenzip.sourceforge.jp/chm/cmdline/commands/extract.htm

Смежные вопросы