ZipArchive - Ne pas mettre les dossiers courants et parents dans l'arborescence

altozinzin
Invité n'ayant pas de compte PHPfrance

14 juil. 2019, 10:53

Salut à tous.
Voila, j'ai codé un petit bout de code en m'inspirant d'autres codes. Le but: créer un fichier ZIP qui contienne tous les fichiers d'un dossier, en respectant l'arborescence et de manière récursive pour les sous-dossiers.

Le code marche plutôt bien mais, quand j'ouvre l'archive, j'ai un dossier ".", qui contient un dossier "_" qui lui même contient enfin le dossier scanné.
Ma question: qu'est-ce qui "merde" dans mon code qui me créé ces deux dossiers un peu gênant. Sinon le code est fonctionnel, pas de soucis de ce côté là.
D'avance merci
function ScanDirectoryZip($Directory){

global $zip;

$MyDirectory = opendir($Directory) or die('Erreur');
while($Entry = @readdir($MyDirectory)) {
	// si c'est un dossier, on le créé dans le zip
if(is_dir($Directory.'/'.$Entry) && $Entry != '.' && $Entry != '..') {
	
$zip->addEmptyDir($Directory.'/'.$Entry);
ScanDirectoryZip($Directory.'/'.$Entry);

}
// si c'est un fichier, on l'ajoute à l'archive
else if ($Entry != '.' && $Entry != '..'){

$zip->addFile($Directory."/".$Entry);

}

}
closedir($MyDirectory);
}

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 8177 Messages

15 juil. 2019, 14:06

"." représente le dossier courant.
".." représente le dossier parent.
Es-tu sûr que ce n'est pas ton logiciel qui lit les fichiers zip qui te les fait apparaitre automatiquement ?
Quand tout le reste a échoué, lisez le mode d'emploi...

altozinzin
Invité n'ayant pas de compte PHPfrance

15 juil. 2019, 17:21

Je ne pense pas.
J'ai un plus de précision:

Ce me faisait ça quand je testais le site en localhost.

J'ai testé en le mettant sur un serveur Linux en local, là y'a carrément toute l’arborescence qui apparaît.
Du genre, un dossier "_", puis un dossier "Volume1", puis web, puis www, ...

altozinzin
Invité n'ayant pas de compte PHPfrance

15 juil. 2019, 17:22

Je précise: j'utilise 7Zip et il fonctionne normalement pour les autres archives

Avatar du membre
Mammouth du PHP | 916 Messages

16 juil. 2019, 18:47

Salut, il n'y a pas vraiment de logique à cela si ce n'est que lors de l'appel initial à ScanDirectoryZip tu fasses par exemple un ScanDirectoryZip('/'). On ne voit d'ailleurs pas cet appel initial ni la manière dont tu initialises la variable $zip.
J'édite souvent mon message après avoir répondu pour le corriger où y apporter des informations complémentaires alors n'hésitez pas à y jeter un nouveau coup d'oeil ^^

altozinzin
Invité n'ayant pas de compte PHPfrance

16 juil. 2019, 21:20

Voici le code d'appel de la commande:
// on commence à creer l'archive
	
	$dossier_sortie = "./zips/".$id.".zip";
	$zip = new ZipArchive();
	 $zip->open($dossier_sortie, ZipArchive::CREATE|ZipArchive::OVERWRITE);
	 
	 
	 // on scanne le dossier
 $Directory = $_POST['chemin']."/".$_POST['nom_fichier'];

  
 ScanDirectoryZip($Directory);

  
  $zip->close();

le $_POST['chemin'] est un chemin relatif