Bei der Verarbeitung von ZIP -Dateien in PHP ist die Funktion zip_read () eine gemeinsame Methode zum Lesen von Zip -Dateieinträgen. Bei der Dekomprimierung einer ZIP -Datei mit einem leeren Verzeichnis werden viele Entwickler auf das Problem der fehlenden leeren Verzeichnisse stoßen. Dies liegt daran, dass das leere Verzeichnis selbst keine Dateien hat. ZIP_READ () durchquert nur standardmäßig Dateieinträge und ignoriert Verzeichniseinträge, was dazu führt, dass das leere Verzeichnis nicht korrekt erstellt wird.
In diesem Artikel wird der Beispielcode kombiniert, um ausführlich festzustellen, wie die Funktion zip_read () verwendet wird, um leere Verzeichnisse korrekt zu identifizieren und zu dekomprimieren, um den Verlust leerer Verzeichnisse zu vermeiden und die vollständige dekomprimierte Dateistruktur zu gewährleisten.
Die Einträge für ZIP -Dateien umfassen sowohl Dateien als auch Verzeichnisse, und Verzeichniseinträge enden normalerweise in / . Im Eintragsname, der von ZIP_READ () zurückgegeben wird, bedeutet dies, dass dies ein Verzeichnis ist. Wenn Sie während der normalen Dekompression nur das entsprechende Verzeichnis der Datei erstellen, aber die leeren Verzeichniseinträge nicht verarbeiten, wird das leere Verzeichnis ignoriert.
Hier ist ein Beispiel, das auf nativen PHP -ZIP -Funktionen basiert, die demonstrieren, wie ZIP -Dateien lesen, Dateien von Verzeichnissen unterscheiden und leere Verzeichnisse korrekt erstellen.
<?php
$zipPath = 'archive.zip'; // ZIP Dateipfad
$extractTo = 'output/'; // Das Zielverzeichnis entpacken
$zip = zip_open($zipPath);
if (!is_resource($zip)) {
die("Nicht öffnen können ZIP dokumentieren\n");
}
while ($entry = zip_read($zip)) {
$entryName = zip_entry_name($entry);
// Stellen Sie fest, ob der Verzeichniseintrag ist,Verzeichniseintrag zu '/' Ende
if (substr($entryName, -1) === '/') {
// Erstellen Sie ein leeres Verzeichnis
$dirPath = $extractTo . $entryName;
if (!is_dir($dirPath)) {
mkdir($dirPath, 0755, true);
echo "Erstellen Sie ein leeres Verzeichnis:$dirPath\n";
}
} else {
// dokumentieren条目,Stellen Sie sicher, dass das Verzeichnis zuerst existiert
$filePath = $extractTo . $entryName;
$dir = dirname($filePath);
if (!is_dir($dir)) {
mkdir($dir, 0755, true);
}
// 读取dokumentieren内容并写入
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 "解压dokumentieren:$filePath\n";
}
}
}
zip_close($zip);
?>
Verzeichniseinträge bestimmen : Verwenden Sie zip_entry_name (), um den Eintragsnamen zu erhalten, und Verzeichniseinträge enden im Allgemeinen mit / .
Erstellen Sie ein leeres Verzeichnis : Erstellen Sie bei der Begegnung eines Verzeichniseintrags das entsprechende Verzeichnis direkt.
Erstellen Sie eine Datei und ihr übergeordnetes Verzeichnis : Stellen Sie für Dateieinträge sicher, dass das übergeordnete Verzeichnis zuerst existiert, und schreiben Sie dann die Dateiinhalte.
Berechtigungen und rekursive Schöpfung : Der dritte Parameter von mkdir () wird auf wahr eingestellt und erstellt rekursiv mehrstufe Verzeichnisse.
Weitere Unterlagen zu PHP -ZIP -Funktionen finden Sie im offiziellen Handbuch: