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

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

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.