Position actuelle: Accueil> Derniers articles> Comment décompresser correctement les fichiers ZIP contenant des répertoires vides à l'aide de la fonction zip_read () pour éviter que le problème des répertoires vides soit perdus?

Comment décompresser correctement les fichiers ZIP contenant des répertoires vides à l'aide de la fonction zip_read () pour éviter que le problème des répertoires vides soit perdus?

M66 2025-07-18

Lors du traitement des fichiers ZIP dans PHP, la fonction zip_read () est une méthode courante pour lire les entrées de fichiers ZIP. Cependant, lors de la décompression d'un fichier zip contenant un répertoire vide, de nombreux développeurs rencontreront le problème des répertoires vides manquants. En effet, le répertoire vide lui-même n'a pas de fichiers. Zip_read () Traverse uniquement les entrées de fichiers par défaut et ignore les entrées du répertoire, ce qui entraîne le répertoire vide qui n'est pas créé correctement.

Cet article combinera l'exemple de code pour introduire en détail comment utiliser la fonction zip_read () pour identifier et décompresser correctement les répertoires vides pour éviter la perte des répertoires vides et assurer la structure complète des fichiers décompressés.


1. Analyse des problèmes

Les entrées pour les fichiers ZIP incluent à la fois des fichiers et des répertoires, et les entrées de répertoire se terminent généralement par / . Dans le nom d'entrée renvoyé par zip_read () , si fini par / , cela signifie qu'il s'agit d'un répertoire. Pendant la décompression normale, si vous créez uniquement le répertoire correspondant du fichier mais ne traitez pas les entrées du répertoire vide, le répertoire vide sera ignoré.


2. Exemple de démonstration de code

Voici un exemple basé sur les fonctions Zip native PHP qui montrent comment lire les fichiers zip, distinguer les fichiers des répertoires et créer correctement les répertoires vides.

 <?php
$zipPath = 'archive.zip'; // ZIP Chemin de fichier
$extractTo = 'output/';   // Décompresser le répertoire cible

$zip = zip_open($zipPath);
if (!is_resource($zip)) {
    die("Impossible d&#39;ouvrir ZIP document\n");
}

while ($entry = zip_read($zip)) {
    $entryName = zip_entry_name($entry);

    // Déterminez si l&#39;entrée du répertoire est,Entrée du répertoire à '/' Fin
    if (substr($entryName, -1) === '/') {
        // Créer un répertoire vide
        $dirPath = $extractTo . $entryName;
        if (!is_dir($dirPath)) {
            mkdir($dirPath, 0755, true);
            echo "Créer un répertoire vide:$dirPath\n";
        }
    } else {
        // document条目,Assurez-vous que le répertoire existe en premier
        $filePath = $extractTo . $entryName;
        $dir = dirname($filePath);
        if (!is_dir($dir)) {
            mkdir($dir, 0755, true);
        }

        // 读取document内容并写入
        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 "解压document:$filePath\n";
        }
    }
}

zip_close($zip);
?>

3. Résumé des points clés

  • Déterminez les entrées du répertoire : utilisez zip_entry_name () pour obtenir le nom d'entrée, et les entrées de répertoire se terminent généralement par / .

  • Créez un répertoire vide : lors de la rencontre d'une entrée de répertoire, créez directement le répertoire correspondant.

  • Créez un fichier et son répertoire parent : pour les entrées de fichiers, assurez-vous que le répertoire parent existe en premier, puis rédigez le contenu du fichier.

  • Autorisations et création récursive : Le troisième paramètre de MKDIR () est défini sur true et crée récursivement des répertoires à plusieurs niveaux.


4. Liens connexes

Pour plus de documentation sur les fonctions ZIP PHP, veuillez vous référer au manuel officiel: