PHPを使用してZIPファイルを処理する場合、 ZIP_READ関数は、アイテムごとに圧縮されたパッケージアイテムでファイルエントリを読み取るために一般的に使用されるインターフェイスです。ただし、MACOSシステムやその他の非表示ファイルによって生成された__Macosxディレクトリなど、不要なフォルダーやファイルエントリに遭遇する場合があります。これらのエントリは通常、ビジネスロジックに意味がなく、ファイル処理フローに干渉する可能性があるため、トラバーサル中にスキップする必要があります。
この記事では、 ZIP_READ関数を使用するときにこれらの特定のファイルエントリをフィルタリングする方法について説明します。
ZIPファイルを開き、ファイルエントリを反復する方法を示す簡単な例を示します。
<?php
$zipPath = 'example.zip';
$zip = zip_open($zipPath);
if ($zip) {
while ($zipEntry = zip_read($zip)) {
$entryName = zip_entry_name($zipEntry);
echo "Found entry: $entryName\n";
}
zip_close($zip);
} else {
echo "Failed to open ZIP file.";
}
?>
トラバーサル中の現在のエントリの名前を決定し、 __macosxおよび同様の無効なエントリから始まるフォルダーを除外する必要があります。
ここで重要なのは、PHPの文字列関数ストップを使用して、エントリ名のプレフィックスを検出することです。
<?php
$zipPath = 'example.zip';
$zip = zip_open($zipPath);
if ($zip) {
while ($zipEntry = zip_read($zip)) {
$entryName = zip_entry_name($zipEntry);
// 飛び越える __MACOSX フォルダー内のすべてのエントリ
if (strpos($entryName, '__MACOSX/') === 0) {
continue;
}
// 还可以飛び越える其他不想対処する的隐藏書類,例えば .DS_Store
if (basename($entryName) === '.DS_Store') {
continue;
}
// 通常の処理コード
echo "ファイルの処理: $entryName\n";
// 読書操作のエントリを開くことができます,例えば:
if (zip_entry_open($zip, $zipEntry)) {
$contents = zip_entry_read($zipEntry, zip_entry_filesize($zipEntry));
// 対処する $contents,例えば保存書類
zip_entry_close($zipEntry);
}
}
zip_close($zip);
} else {
echo "開くことができません ZIP 書類";
}
?>
zip_readを使用してzipエントリを1つずつ読み取る場合は、エントリ名を確認してください。
STRPOSを使用して、エントリ名が__macosx/で始まり、このディレクトリのすべてのファイルをスキップするかどうかを判断します。
同時に、特定のファイル名( .ds_storeなど)に対してフィルタリングを実行できます。
これにより、役に立たないMACOSシステムファイルの処理を効果的に回避し、コードの堅牢性と効率を向上させることができます。