Position actuelle: Accueil> Derniers articles> Comment sauter des entrées de fichiers spécifiques telles que __macosx lors de l'utilisation de la fonction zip_read?

Comment sauter des entrées de fichiers spécifiques telles que __macosx lors de l'utilisation de la fonction zip_read?

M66 2025-06-12

Lorsque vous utilisez PHP pour traiter les fichiers ZIP, la fonction zip_read est une interface couramment utilisée pour lire les entrées de fichiers dans un élément de package compressé par élément. Cependant, nous rencontrons parfois des dossiers ou des entrées de fichiers indésirables, tels que le répertoire __MACOSX généré par le système MacOS ou d'autres fichiers cachés. Ces entrées n'ont généralement aucun sens à notre logique métier et peuvent même interférer avec le flux de traitement de fichiers, ils doivent donc être sautés pendant la traversée.

Cet article expliquera comment filtrer ces entrées de fichiers spécifiques lors de l'utilisation de la fonction zip_read .

Exemples de base

Voici un exemple simple montrant comment ouvrir un fichier zip et itérer sur les entrées de fichier:

 <?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.";
}
?>

Sauter __macosx et autres dossiers ou fichiers spécifiés

Nous devons déterminer le nom de l'entrée actuelle pendant la traversée et exclure les dossiers commençant par __macosx et des entrées non valides similaires.

La clé ici est d'utiliser StrPos de fonction String de Php pour détecter le préfixe du nom d'entrée:

 <?php
$zipPath = 'example.zip';
$zip = zip_open($zipPath);

if ($zip) {
    while ($zipEntry = zip_read($zip)) {
        $entryName = zip_entry_name($zipEntry);

        // franchir __MACOSX Toutes les entrées dans le dossier
        if (strpos($entryName, '__MACOSX/') === 0) {
            continue;
        }

        // 还可以franchir其他不想traiter avec的隐藏document,Par exemple .DS_Store
        if (basename($entryName) === '.DS_Store') {
            continue;
        }

        // Code de traitement normal
        echo "Fichiers de traitement: $entryName\n";

        // Vous pouvez ouvrir une entrée pour la lecture des opérations,Par exemple:
        if (zip_entry_open($zip, $zipEntry)) {
            $contents = zip_entry_read($zipEntry, zip_entry_filesize($zipEntry));
            // traiter avec $contents,Par exemple保存document
            zip_entry_close($zipEntry);
        }
    }
    zip_close($zip);
} else {
    echo "Impossible d&#39;ouvrir ZIP document";
}
?>

Résumer

  • Lorsque vous utilisez ZIP_READ pour lire les entrées ZIP une par une, vérifiez le nom de l'entrée.

  • Utilisez STRPOS pour déterminer si le nom d'entrée commence par __macosx / et sautez tous les fichiers de ce répertoire.

  • Dans le même temps, le filtrage peut être effectué pour des noms de fichiers spécifiques (tels que .ds_store ).

  • Cela peut éviter efficacement le traitement des fichiers système macOS inutiles et améliorer la robustesse et l'efficacité du code.