181 votes

Comment compresser un dossier entier en utilisant PHP

J'ai trouvé ici, sur le site de stackoveflow, quelques codes sur la façon de ZIPer un fichier spécifique, mais comment faire pour un dossier spécifique ?

Folder/
  index.html
  picture.jpg
  important.txt

à l'intérieur My Folder il y a des fichiers. après avoir compressé le My Folder Je veux aussi supprimer tout le contenu du dossier, sauf les éléments suivants important.txt .

J'ai trouvé ça ici à pile

J'ai besoin de votre aide. Merci.

429voto

Dador Points 871

Code mis à jour le 03/02/2014. Correction d'un bug avec la suppression (merci à hek2mgl ) et a ajouté une véritable itération récursive.

// Get real path for our folder
$rootPath = realpath('My Folder');

// Initialize archive object
$zip = new ZipArchive;
$zip->open('file.zip', ZipArchive::CREATE);

// Initialize empty "delete list"
$filesToDelete = array();

// Create recursive directory iterator
$files = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator($rootPath),
    RecursiveIteratorIterator::LEAVES_ONLY
);

foreach ($files as $name => $file) {
    // Get real path for current file
    $filePath = $file->getRealPath();

    // Add current file to archive
    $zip->addFile($filePath);

    // Add current file to "delete list" (if need)
    if ($file->getFilename() != 'important.txt') 
    {
        $filesToDelete[] = $filePath;
    }
}

// Zip archive will be created only after closing object
$zip->close();

// Delete all files from "delete list"
foreach ($filesToDelete as $file)
{
    unlink($file);
}

66voto

Mark Baker Points 90240

Il existe une méthode utile non documentée dans la classe ZipArchive : addGlob() ;

$zipFile = "./testZip.zip";
$zipArchive = new ZipArchive();

if (!$zipArchive->open($zipFile, ZIPARCHIVE::OVERWRITE))
    die("Failed to create archive\n");

$zipArchive->addGlob("./*.txt");
if (!$zipArchive->status == ZIPARCHIVE::ER_OK)
    echo "Failed to write files to zip\n";

$zipArchive->close();

Maintenant documenté à : www.php.net/manual/en/ziparchive.addglob.php

29voto

Kevin Read Points 1260

Je suppose que cela fonctionne sur un serveur où l'application zip se trouve dans le chemin de recherche. Cela devrait être vrai pour tous les serveurs basés sur Unix et, je suppose, pour la plupart des serveurs basés sur Windows.

exec('zip -r archive.zip "My folder"');
unlink('My\ folder/index.html');
unlink('My\ folder/picture.jpg');

L'archive se trouvera ensuite dans archive.zip. Gardez à l'esprit que les blancs dans les noms de fichiers ou de dossiers sont une cause fréquente d'erreurs et doivent être évités dans la mesure du possible.

23voto

netcoder Points 31874

Essayez ça :

$zip = new ZipArchive;
$zip->open('myzip.zip', ZipArchive::CREATE);
foreach (glob("target_folder/*") as $file) {
    $zip->addFile($file);
    if ($file != 'target_folder/important.txt') unlink($file);
}
$zip->close();

Ce site ne sera pas zip de manière récursive cependant.

4voto

Akram Points 31

Si l'extension PHP ZipArchive n'est pas activée, nous ne pouvons pas utiliser la classe ZipArchive au lieu de Je peux utiliser cette classe pour créer une archive zip.

voici ma proposition de poste pour Créer une archive Zip d'un répertoire entier php fichiers sélectionnés

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X