ZIPファイルをPHPで処理する場合、 ZIP_READ()関数はZIPファイルエントリを読み取るための一般的な方法です。ただし、空のディレクトリを含むZIPファイルを減圧すると、多くの開発者は空のディレクトリを欠いているという問題に遭遇します。これは、空のディレクトリ自体にファイルがないためです。 zip_read()はデフォルトでファイルエントリのみをトラバースし、ディレクトリエントリを無視するため、空のディレクトリが正しく作成されません。
この記事では、サンプルコードを組み合わせて、 zip_read()関数を使用して空のディレクトリを正しく識別および解凍する方法を詳細に紹介し、空のディレクトリの喪失を避け、完全な解凍ファイル構造を確保します。
ZIPファイルのエントリにはファイルとディレクトリの両方が含まれ、ディレクトリエントリは通常/で終了します。 zip_read()によって返されたエントリ名で、 /で終了する場合、これはディレクトリであることを意味します。通常の減圧中に、ファイルの対応するディレクトリのみを作成しているが、空のディレクトリエントリを処理しない場合、空のディレクトリは無視されます。
以下は、ZIPファイルを読み取り、ディレクトリを区別し、空のディレクトリを正しく作成する方法を示すPHPネイティブのZIP関数に基づいた例です。
<?php
$zipPath = 'archive.zip'; // ZIP ファイルパス
$extractTo = 'output/'; // ターゲットディレクトリを解凍します
$zip = zip_open($zipPath);
if (!is_resource($zip)) {
die("開くことができません ZIP 書類\n");
}
while ($entry = zip_read($zip)) {
$entryName = zip_entry_name($entry);
// ディレクトリエントリがあるかどうかを判断します,ディレクトリエントリへ '/' エンディング
if (substr($entryName, -1) === '/') {
// 空のディレクトリを作成します
$dirPath = $extractTo . $entryName;
if (!is_dir($dirPath)) {
mkdir($dirPath, 0755, true);
echo "空のディレクトリを作成します:$dirPath\n";
}
} else {
// 書類条目,最初にディレクトリが存在することを確認してください
$filePath = $extractTo . $entryName;
$dir = dirname($filePath);
if (!is_dir($dir)) {
mkdir($dir, 0755, true);
}
// 读取書類内容并写入
if (zip_entry_open($zip, $entry)) {
$fp = fopen($filePath, 'w');
while ($data = zip_entry_read($entry, 1024)) {
fwrite($fp, $data);
}
fclose($fp);
zip_entry_close($entry);
echo "解压書類:$filePath\n";
}
}
}
zip_close($zip);
?>
ディレクトリエントリの決定: zip_entry_name()を使用してエントリ名を取得し、ディレクトリエントリは通常/で終了します。
空のディレクトリを作成する:ディレクトリエントリに遭遇したときに、対応するディレクトリを直接作成します。
ファイルとその親ディレクトリを作成します。ファイルエントリの場合、親ディレクトリが最初に存在することを確認し、次にファイルの内容を書き込みます。
権限と再帰作成: MKDIR()の3番目のパラメーターはTRUEに設定され、再帰的にマルチレベルのディレクトリを作成します。
PHP ZIP関数の詳細については、公式マニュアルを参照してください。