zip アーカイブ内のディレクトリの内容を出力ディレクトリに抽出する必要があります。
zip 内のディレクトリ名は何でもかまいません。ただし、zip アーカイブのベースにある唯一のディレクトリになります。ただし、zip アーカイブ内のディレクトリには、任意の数のファイルが存在する可能性があります。
zip 内のファイル構造は、これらの行に沿っています。
- d0001
- My Folder
- view.php
- tasks.txt
- file1.txt
- picture1.png
- document.doc
出力ディレクトリの内容は次のようになっている必要があります。
- My Folder
- view.php
- tasks.txt
- file1.txt
- picture1.png
- document.doc
私が現在持っているコードは、出力ディレクトリの内容を削除し、zip アーカイブ全体をディレクトリに抽出します。
function Unzip($source, $destination) {
$zip = new ZipArchive;
$res = $zip->open($source);
if($res === TRUE) {
$zip->extractTo($destination);
$zip->close();
return true;
} else {
return false;
}
}
function rrmdir($dir, $removebase = true) {
if(is_dir($dir)) {
$objects = scandir($dir);
foreach($objects as $object) {
if($object != "." && $object != "..") {
if(filetype($dir."/".$object) == "dir") rrmdir($dir."/".$object); else unlink($dir."/".$object);
}
}
reset($objects);
if($removebase == true)
rmdir($dir);
}
}
$filename = '/home/files.zip';
$dest = '/home/myfiles/';
if(is_dir($dest)) {
rrmdir($dest, false);
$unzip = Unzip($filename, $dest);
if($unzip === true) {
echo 'Success';
} else
echo 'Extraction of zip failed.';
} else
echo 'The output directory does not exist!';
関数rrmdir()
が行うのは、出力ディレクトリの内容を削除することだけです。