begin process at 2012 02 12 08:59:28
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Fichier / Disque

 > COPIER UN RÉPERTOIRE ET TOUT CE QU'IL CONTIENT

COPIER UN RÉPERTOIRE ET TOUT CE QU'IL CONTIENT


 Information sur la source

Note :
9 / 10 - par 2 personnes
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Fichier / Disque Classé sous :copier, dossier, fichiers, copy, récursivité Niveau :Débutant Date de création :31/08/2005 Date de mise à jour :10/11/2005 10:03:01 Vu :23 451

Auteur : malalam

Ecrire un message privé
Site perso
Commentaire sur cette source (33)
Ajouter un commentaire et/ou une note

 Description

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

  • <?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
  • ?>
<?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 
?>



 Historique

31 août 2005 17:10:33 :
On peut appeler la fonction avec 2 chaines dorénavant. Correction de warnings.
10 novembre 2005 10:03:01 :
Correction très rapide d'un bug. J'optimiserai plus tard, là je n'avais pas le temps. Du coup, on se retrouver avec 2 fonctions au lieu d'une...il y a plus simple :-) Mais ce sera pour un peu plus tard (bah ouais, y en a qui travaillent!!)

 Sources du même auteur

Source avec Zip ASTUCES/HACK PHP
SQUELETTE DE GESTION DES DROITS
[PHP 5.1] CLASS STRING : NOUVEL EXEMPLE SUR LA SPL
Source avec Zip Source avec une capture [PHP 5.1] PHOTOPHOP (PHPDRAW 2)
Source avec Zip Source avec une capture [PHP5.1] O-LOC : CLASSE ET BACKOFFICE D'INTERNATIONALISATION

 Sources de la même categorie

UPLOADER DES FICHIER DANSUN DOSSIER, SÉCURISÉ AVEC MOT DE PA... par raizzo
COMPTEUR DE VISITES SUR FICHIER par pierreSabatier
FONCTION RECURSIVE DE DOSSIERS par tefa24600
Source avec Zip CONVERSION DES UNITÉS INFORMATIQUE (O, KIO, MIO, GIO, TIO...... par genetApt151
TROUVER LES DOUBLONS DANS UNE LISTE DE FICHIERS par soobook

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture FONCTION RÉCURSIVE POUR GÉNÉRER UNE ARBORESCENCE DE FICHIERS... par caviar
GÉNÉRATION RÉCURSIVE D'UNE ARBORESCENCE DE RÉPERTOIRES par webdeb
CRÉATION D'UNE ARBORESCENCE par Charles Racaud
LISTER LES FICHIERS D'UN DOSSIER ET EN FAIRE DES LIENS ( MEI... par Evangun
SUPPRIMER 1 U PLUSIEURS RÉPERTOIRES ET TOUT CE QU'IL Y A DED... par malalam

Commentaires et avis

Commentaire de Anthomicro le 31/08/2005 16:48:21

Salut Malalam :-)

dommage pour l'array en second paramètre, mais sinon c'est propre (dommage que phpcs ne conserve pas les styles... c'est lourd)

Commentaire de malalam le 31/08/2005 17:03:12 administrateur CS

Merci :-)

D'accord pour cs...c'est chiant lol, c'est moche comme code, presque à tous les coups.

Pour le tableau...ouais lol. mais je crois que je vais modifier ça...c'est vraiment pas top comme appel du coup.

Commentaire de malalam le 31/08/2005 17:12:10 administrateur CS

Voila c'est corrigé lol.

Commentaire de Anthomicro le 31/08/2005 17:14:41

Bah tu vois c'était pas si long que ça à corriger (comme mon quiz sur mon site qui ne gérait pas les niveaux, je l'ai refait ça m'a pris une demi heure max mais bon j'avais la flemme de le faire mdr)

Commentaire de malalam le 01/09/2005 09:08:00 administrateur CS

Voui lol, c'est parce que je n'avais pas pensé à contourner de cette manière...là je dis : si le 2d paramètre n'est pas un tableau...transforme le en tableau, lol. Je triche un peu quoi...

Mais bon oui la flemme du développeur est une maladie bien connue lol ;-)

Commentaire de Anthomicro le 01/09/2005 09:53:30

mdr j'avais pas vu, ouais en effet ^^

Commentaire de coucou747 le 03/09/2005 20:42:10 administrateur CS

à la ligne 28, tu ne vérifie pas si tu as les droits de copier le fichier (si copy renvoi true ou false...)

Commentaire de malalam le 05/09/2005 10:13:40 administrateur CS

Exact.
D'un autre côté, si je teste le false, je risque d'avoir des résultats inattendus avec Windows. Cf la doc de copy : copy () renverra false sous Windows si on tente de copier un fichier dont la taille est nulle, MAIS le fichier sera néanmoins correctement copié.
Ce que je pourrais faire est tester l'existence du 2ème fichier (la copie) après, éventuellement... ce n'est pas une mauvaise idée.

Commentaire de mictif le 08/09/2005 12:02:42

function deplace_dir($source,$destination){
    if (!is_dir($destination)){
        mkdir($destination,0777);
    }
    $dossier=opendir($source);

    while (false != = ($fichier = readdir($dossier))) {// attention a la version de php pour le "!= ="
            $l = array('.', '..');    
            if (!in_array( $fichier, $l)){
                    if (is_dir($source."/".$fichier)){
                        deplace_dir($source."/".$fichier, $destination."/".$fichier);
                    }
                    else{
                        copy ($source."/".$fichier, $destination."/".$fichier);
                        unlink($source."/".$fichier);    
                    }
            }
    }
    @closedir($dossier);
    rmdir($source);
}

voila :)

Commentaire de malalam le 08/09/2005 12:23:52 administrateur CS

Mictif => ahem...

Sans vérification, mais bien plus court ;-) :

<?php
function deplacer_ ($destination, $source) { // methode pour deplacer fichier ou repertoire
$destTemp =$destination. '/'.basename ($source);
if (!file_exists ($destTemp)) {
rename ($source, $destTemp);
    }
}

deplacer_ ('bli', 'bla/exemples');
?>

Commentaire de ben53000 le 09/11/2005 19:22:18

mouai pas terrible je viens de le tester ce code avec un repertoire contenant plusieurs dossiers avec plusieurs fichiers et j'ai été déçu.
Je me suis rendu compte que tous les fichiers étaient mis dans tous les dossiers peut importe s'il était bien a l'origine dans celui ci.
Il y a certaines choses à revoir.
Saluté

Commentaire de Anthomicro le 09/11/2005 19:31:01

Salut,

il aurait été bien de donner la structure de ce que t'as copié pour aider Malalam a résoudre les problèmes de ce script...

Commentaire de malalam le 10/11/2005 09:15:48 administrateur CS

Il a raison, je viens de retester :-)

Pas grave, je modifierai ça dans la journée, c'est une erreur de "modification" (en fait cette fonction est extraite de la méthode d'une classe que j'ai développé pour mon explorateur php, et en effectuant la conversion méthode => fonction, j'ai dû faire unr petite bourde).

Commentaire de malalam le 10/11/2005 10:06:47 administrateur CS

Voilà corrigé...mais à la va très vite ;-) J'optimiserai plus tard, là j'ai pas mal de taf malheureusement.

Commentaire de ben53000 le 10/11/2005 11:11:53

ok, là c'est hyper good, ça marche nikel, bravo pour le code et la rapidité.

Commentaire de malalam le 10/11/2005 11:37:46 administrateur CS

Je t'en prie, merci d'avoir relevé ce gros bug :-)

Commentaire de FhX le 10/11/2005 16:01:50

"# if (!is_array ($reps)) {
#             $reps = array ($reps);
#         }"
Tu peux forcer le type au début de ta fonction :

"function copier_rep ($destination, (array) $reps, $tableau_dir = array ()) { //"

Mais je crois que c'est spécifique à PHP5 par contre.

Commentaire de malalam le 10/11/2005 16:10:39 administrateur CS

Ah tien, je ne savais pas ça...m'en vais jeter un oeil, merci :-)

Commentaire de Anthomicro le 10/11/2005 16:13:47

ça me fait penser à du java ^^

Commentaire de malalam le 10/11/2005 16:18:55 administrateur CS

Bah vouai, ça existe :
http://fr2.php.net/language.types.type-juggling

C'est bon à savoir ça! J'ai pas encore testé dans cette fonction mais y a pas de raison que ça ne marche pas lol.

Commentaire de pssinjaune le 18/11/2006 03:31:11

J'ai bien failli attraper une crise de nerfs ....
Je fesais un test sur le resultat de la copie qui est censé renvoyé true ou false:
"Renvoie true en cas de succès, false sinon." C'est ce que tu as ecrit j'invente rien.

Apres avoir galere une heure au moins a essayer de faire marcher la suite de mon code qui dépendait du succés de la copie (censé renvoyé true ...) et bien je me suis apercu que ca renvoyé que dalle et que c'est  cause de ca que ca foiré!

Bien joué pour ta fonction qui est bien utile mais tu mérite néanmoins une calbote pour le "Renvoie true en cas de succès, false sinon." ^^...

Commentaire de Jeystrash le 24/07/2007 13:07:07

Super script !
Mais comment fait on si on veut que le repertoire de destination porte un autre nom ?
Merci !!

Commentaire de malalam le 24/07/2007 14:03:10 administrateur CS

Merci :-)

rename() c'est encore le plus simple.

Commentaire de doudje le 14/03/2008 18:42:40 8/10

Un joli code de côté de résultat, mais côté code source c'est un peu plus bourré pour un simple copier/coller de répertoire.

Commentaire de g_fuck le 03/08/2008 21:27:10

ma qustion est si en copiant un repertoir on copy aussi sont UID?
merci!

Commentaire de coucou747 le 03/08/2008 21:30:43 administrateur CS

tu peux tester...

(non, il prend l'uid de celui qui copie)

Commentaire de g_fuck le 04/08/2008 08:52:34

thanx coucou! donc si je le copie via php (via mon site donc) tout le monde qui aura acces a ce site pourra avoir acces a ce dossier ?

Commentaire de coucou747 le 04/08/2008 13:16:10 administrateur CS

tu peux tester...

Commentaire de soundpanther le 18/10/2008 08:45:53 10/10

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


Commentaire de soundpanther le 18/10/2008 11:33:24

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

Commentaire de soundpanther le 18/10/2008 16:20:23

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,

Commentaire de darakk le 29/07/2009 19:01:04

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.  

Commentaire de bmsalah le 03/08/2010 14:25:11

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

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Problème avec les fonctions mkdir et copy [ par i_robot ] Salut, j'ai un probleme avec les fonction mkdir et copy. je veut copier un copier un dossier et le rennomer selon le nom que le visiteur aura choisi. Sauvegarde de fichiers [ par magicsmacks ] Bonjour,Je possède 2 serveurs, et afin de sauvegarder les données de l'un des deux serveurs sur le second, j'aimerais créer un script pour copier des comparer [ par jnbdzjnbdz ] Bonjour, je me demandais comment comparer le nom de fichiers image (jpg|jpeg|gif|png) avec le nom de d'autres fichiers image dans un autre dossier app Gestion de fichiers [ par shadow1779 ] Bonjour,j'aimerai apprendre le plus possible sur la gestion de fichiers en php, c'est a dire:-suppression d'un fichier-création/suppression d'un dossi Lecture d'un nom de fichier...2 [ par magicsmacks ] Bonjour, J'avais demandais il y a qq jours ceci : " Bonjour, Je poss&#232;de un dossier sur mon serveur dans lequel impression de fichiers [ par putch ] bonjour &#224; tous !voila mon soucij'ai un repertoire pdf/ lequel se trouve un certains nombre de fichiers pdf :)je souhaiterai un lien/bouton pour l Tout le monde peut accéder à mes fichiers, comment bloquer cela? [ par hasen ] Bonjour, bonjour. Je ne suis pas sur que cette question soit completement en rapport avec PHP, mais il me faut a tout rpix une reponse et je ne savais Upload multiple de fichiers [ par Sly_83 ] Bonjour,je cherche un script qui permet d'uploader plusieurs fichiers mais sans les électionner un par un, par exemple en pointant vers un dossier et les liens vers les fichiers [ par abdellah1505 ] Bonjour,j'ai trouvé ce script qui liste les 3 derniers fichiers ajouté dans un dossier mais il ne donne pas des liens vers les fichiers juste leurs no Créer un tableau html en php... avec une subtilité ! [ par vxr888 ] Bonsoir à tous,J'ai un soucis et j'espère trouver une réponse chez vous.Je vous expose le problème :J'ai écrit un code qui parcourt un dossier (avec r


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,106 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales