par
moogli » 13 sept. 2016, 14:34
tu peux utiliser un
RecursiveDirectoryIterator à la place du DirectoryItérator

cela te permettra de descendre dans l'arborescence simplement.
sinon tu codes toi même lé récursivité en mettant dans une fonction la partie qui parcourt le système de fichier et si l'élément courant elle s'auto appel
ça donne un truc comme ça (non testé)
<?php
/**
* parcourt d'un répertoire et de ses enfants pour les ajouter au zip
*/
function myRecursiveIterator($path, $zip)
{
$dir = new DirectoryIterator($path);
foreach ($dir as $fileinfo) {
if (!$fileinfo->isDot() && !$fileinfo->isDir()) {
// gaffe à la gestion du path il faut savoir où l'on se trouve dans l'archove et où l'on place le Fichier
// a priori si tu ajoutes en nom de fichier (2nd paramètre) un chemin relatif à la racine tu n'as pas de soucis en clair temp/fichier pour /www/tmp/fichier
if (!$zip->addFile($fileinfo->getRealPath(), $fileinfo->getBasename())) {
echo 'Impossible d'ajouter "'.$fileinfo-> getRealPath().'".<br/>';
} else {
echo 'Fichier '.$fileinfo->getFilename().' ajouté<br />';
}
} elseif ($fileinfo->isDir()) {
// à vérifier
$zip->addEmptyDir ($fileinfo->getBasename());
myRecursiveIterator($fileinfo->getRealPath(), $zip);
}
}
}
$zip = new ZipArchive();
$oppened =$zip->open('Archive.zip', ZipArchive::CREATE);
if ($oppened === true) {
myRecursiveIterator('./', $zip);
echo "Nombre de fichiers : " . $zip->numFiles . "\n<br />";
echo "Statut :" . $zip->getStatusString() . "\n<br />";
echo "fichier :" . $zip->filename . "\n<br />";
$zip->close();
} else {
echo 'Erreur, impossible de créer l'archive.<br/>';
echo 'code erreur : ', $oppened,'<br />';
}
ou un truc dans le genre (non testé non plus)
<?php
$path = dirname(__FILE__);
$zip = new ZipArchive();
$oppened =$zip->open('Archive.zip', ZipArchive::CREATE);
if ($oppened === true) {
$Directory = new RecursiveDirectoryIterator($path);
$Iterator = new RecursiveIteratorIterator($Directory);
foreach ($Iterator as $fileinfo) {
if (!$fileinfo->isDot() && !$fileinfo->isDir()) {
// gaffe à la gestion du path il faut savoir où l'on se trouve dans l'archove et où l'on place le Fichier
// a priori si tu ajoutes en nom de fichier (2nd paramètre) un chemin relatif à la racine tu n'as pas de soucis en clair temp/fichier pour /www/tmp/fichier
$file = $fileinfo->getPathname() .'/'. $fileinfo->getBasename();
$zip->addFile($fileinfo->getRealPath(), $file) ;
} elseif ($fileinfo->isDir()) {
$zip->addEmptyDir($fileinfo->getBasename());
}
}
echo "Nombre de fichiers : " . $zip->numFiles . "\n<br />";
echo "Statut :" . $zip->getStatusString() . "\n<br />";
echo "fichier :" . $zip->filename . "\n<br />";
$zip->close();
} else {
echo 'Erreur, impossible de créer l'archive.<br/>';
echo 'code erreur : ', $oppened,'<br />';
}
@+
tu peux utiliser un [url=http://php.net/manual/fr/class.recursivedirectoryiterator.php]RecursiveDirectoryIterator[/url] à la place du DirectoryItérator ;)
cela te permettra de descendre dans l'arborescence simplement.
sinon tu codes toi même lé récursivité en mettant dans une fonction la partie qui parcourt le système de fichier et si l'élément courant elle s'auto appel
ça donne un truc comme ça (non testé)
[php]<?php
/**
* parcourt d'un répertoire et de ses enfants pour les ajouter au zip
*/
function myRecursiveIterator($path, $zip)
{
$dir = new DirectoryIterator($path);
foreach ($dir as $fileinfo) {
if (!$fileinfo->isDot() && !$fileinfo->isDir()) {
// gaffe à la gestion du path il faut savoir où l'on se trouve dans l'archove et où l'on place le Fichier
// a priori si tu ajoutes en nom de fichier (2nd paramètre) un chemin relatif à la racine tu n'as pas de soucis en clair temp/fichier pour /www/tmp/fichier
if (!$zip->addFile($fileinfo->getRealPath(), $fileinfo->getBasename())) {
echo 'Impossible d'ajouter "'.$fileinfo-> getRealPath().'".<br/>';
} else {
echo 'Fichier '.$fileinfo->getFilename().' ajouté<br />';
}
} elseif ($fileinfo->isDir()) {
// à vérifier
$zip->addEmptyDir ($fileinfo->getBasename());
myRecursiveIterator($fileinfo->getRealPath(), $zip);
}
}
}
$zip = new ZipArchive();
$oppened =$zip->open('Archive.zip', ZipArchive::CREATE);
if ($oppened === true) {
myRecursiveIterator('./', $zip);
echo "Nombre de fichiers : " . $zip->numFiles . "\n<br />";
echo "Statut :" . $zip->getStatusString() . "\n<br />";
echo "fichier :" . $zip->filename . "\n<br />";
$zip->close();
} else {
echo 'Erreur, impossible de créer l'archive.<br/>';
echo 'code erreur : ', $oppened,'<br />';
}[/php]
ou un truc dans le genre (non testé non plus)
[php]<?php
$path = dirname(__FILE__);
$zip = new ZipArchive();
$oppened =$zip->open('Archive.zip', ZipArchive::CREATE);
if ($oppened === true) {
$Directory = new RecursiveDirectoryIterator($path);
$Iterator = new RecursiveIteratorIterator($Directory);
foreach ($Iterator as $fileinfo) {
if (!$fileinfo->isDot() && !$fileinfo->isDir()) {
// gaffe à la gestion du path il faut savoir où l'on se trouve dans l'archove et où l'on place le Fichier
// a priori si tu ajoutes en nom de fichier (2nd paramètre) un chemin relatif à la racine tu n'as pas de soucis en clair temp/fichier pour /www/tmp/fichier
$file = $fileinfo->getPathname() .'/'. $fileinfo->getBasename();
$zip->addFile($fileinfo->getRealPath(), $file) ;
} elseif ($fileinfo->isDir()) {
$zip->addEmptyDir($fileinfo->getBasename());
}
}
echo "Nombre de fichiers : " . $zip->numFiles . "\n<br />";
echo "Statut :" . $zip->getStatusString() . "\n<br />";
echo "fichier :" . $zip->filename . "\n<br />";
$zip->close();
} else {
echo 'Erreur, impossible de créer l'archive.<br/>';
echo 'code erreur : ', $oppened,'<br />';
}[/php]
@+