Copier un répertoire et tout ce qu'il contient

Soyez le premier à donner votre avis sur cette source.

Snippet vu 27 215 fois - Téléchargée 27 fois

Contenu du snippet

Comme je vois que c'est la mode des fonctions sur les fichiers ;-) avec 2 jolies fonctions pour créer des dossiers, je me lance aussi !
Voici une fonction permettant de copier un répertoire dans un autre, ainsi que tout ce qu'il contient : fichiers, sous-répertoires.

Renvoie true en cas de succès, false sinon.

Source / Exemple :


<?php
                                       
function create_tab ($dir) { // fonction creant le tableau contenant les repertoires et fichiers
    $dir = rtrim ($dir, '/'); // on vire un eventuel slash mis par l'utilisateur de la fonction a droite du repertoire
		if (is_dir ($dir)) // si c'est un repertoire
			$dh = opendir ($dir); // on l'ouvre
		else {
			echo $dir, ' n\'est pas un repertoire valide'; // sinon on sort! Appel de fonction non valide
			exit;
			}
		while (($file = readdir ($dh)) !== false ) { //boucle pour parcourir le repertoire 
			if ($file !== '.' && $file !== '..') { // no comment
				$path =$dir.'/'.$file; // construction d'un joli chemin...
				if (is_dir ($path)) { //si on tombe sur un sous-repertoire 
					$tableau[$dir]['dir'][] = $path;
					$tabTmp = create_tab ($path); // appel recursif pour lire a l'interieur de ce sous-repertoire
					if (is_array ($tabTmp) && is_array ($tableau))
						$tableau = array_merge ($tableau, $tabTmp);
				}
				else
					$tableau[$dir]['file'][] = $path;
			}
		}
		closedir ($dh); // on ferme le repertoire courant
		if (isset ($tableau)) {
            return $tableau;
        }
	}

function copier_rep ($destination, $reps, $tableau_dir = array ()) { // fonction pour copier repertoire : on cree un repertoire de meme nom, puis on va chercher les fichiers, et on les copie. Si il y a des sous repertoires, appel recursif.
		if (empty ($tableau_dir)) {
			echo 'Entrée';
			$tableau_dir = create_tab ($reps);
		}
		if (!is_array ($reps)) {
			$reps = array ($reps);
		}
		foreach ($reps as $rep) {
			if (!is_dir ($destination.'/'.basename ($rep))) {
				mkdir ($destination.'/'.basename ($rep));
				if (!empty ($tableau_dir[$rep]['file']) && isset($tableau_dir[$rep]['file']) && is_array ($tableau_dir[$rep]['file'])) {
					foreach ($tableau_dir[$rep]['file'] as $fichier) {
						copy ($fichier, $destination.'/'.basename ($rep).'/'.basename ($fichier));
					}
				}
				if (!empty ($tableau_dir[$rep]['dir']) && isset ($tableau_dir[$rep]['dir']) && is_array ($tableau_dir[$rep]['dir'])) {
					copier_rep ($destination.'/'.basename ($rep), $tableau_dir[$rep]['dir'], $tableau_dir);
				}
			}
		}
	}
	
copier_rep ('test', 'test2'); // 1er paramètre : le répertoire de destination sous forme d'une chaine 
                                      // 2d paramètre : le répertoire à copier sous forme d'une chaine ou d'un tableau 
?>

A voir également

Ajouter un commentaire Commentaires
Messages postés
5
Date d'inscription
dimanche 2 mars 2008
Statut
Membre
Dernière intervention
25 août 2010

salut tous le monde,
j'ai besoin une methode ou un programme
Pour déterminer la taille de la copie d'un fichier vers le flash disque. voila mon Email: Bmsalah@gmail.com
et merci à tous
Messages postés
3
Date d'inscription
mercredi 24 octobre 2007
Statut
Membre
Dernière intervention
29 juillet 2009

Très bon script, mais je cherche à nommer le répertoire de destination avant qu'il copie le contenue du répertoire source dedans. l'intérêt est de pouvoir tout faire dans 1 seul répertoire plutôt que de devoir avoir la copie dans un autre répertoire.
evitez de me cité la fonction rename(), elle n'est pas adéquate dans mon cas de figure.
Messages postés
68
Date d'inscription
vendredi 27 juillet 2007
Statut
Membre
Dernière intervention
31 janvier 2009

Bonjour,

3 réponses sur d'autres forums, il sont rendu le code 3 fois plus rapide

Problème résolut merci quand même.

Cordialement,
Messages postés
68
Date d'inscription
vendredi 27 juillet 2007
Statut
Membre
Dernière intervention
31 janvier 2009

Bonjour,

je suis arriver a modifier cette ligne par celle ci mais je n'arrive pas encore pour les sous-répertoire
copy ($fichier, $destination.'/'.basename ($rep).'/'.basename ($fichier));
copy ($fichier, $destination.'/'.basename ($fichier));

Merci d'avance
Messages postés
68
Date d'inscription
vendredi 27 juillet 2007
Statut
Membre
Dernière intervention
31 janvier 2009

Bonjour,

il est super votre script,

comment copier le contenue d'un répertoire juste son contenue. ?

copier_rep ('doss1', 'doss2');

je voudrais que doss1 doss1/*.* contenue de doss2
est non doss1 doss1/doss2/*.* contenue de doss2

Merci d'avance
Afficher les 33 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.