Batch de move récursif

Mammouth du PHP | 736 Messages

10 août 2011, 16:26

Bonjour,

Voici un petit script permettant de créer un fichier .bat permettant de déplacer tous les répertoires et sous-répertoires d'un dossier vers une destination donnée.
<?php 

//peut servir pour compléter chaque ligne du batch
$path='';

//fonction principale
function scan($repertoire) {
	$monrepertoire = opendir($repertoire) or die("Erreur de listage : le répertoire n'existe pas"); 
		
		while($element = @readdir($monrepertoire)) {
			
			//on teste si l'élément est bien un répertoire
			if(is_dir($repertoire.'/'.$element) && $element != '.' && $element != '..') {				

				//on peaufine la ligne du batch en chuintant, remplacant...
				$modifs = substr($repertoire.'\\'.$element,2,4000);
				
				//on écrit la ligne de commande qui sera sauvegardée
				$final = 'move '.$modifs.'\*.* dossier de destination';	
			
				//on crée et incrémete le fichier copie.bat
				$bat = fopen("copie.bat", "a+"); 
				fwrite($bat, $final."\n");   
				fclose($bat);
				
				//récursivité pour avoir autant de lignes de commande que de dossiers
				scan($repertoire.'\\'.$element);
			}
	
	}
	
	closedir($monrepertoire);
}

//appel initial
scan('.');

if(file_exists('copie.bat')){
echo 'fichier .bat généré';	
}
?>
Théorie -> Albat (encore merci !)
Développement -> Mega

Si vous voyez un truc qui cloche, n'hésitez pas :)

Mega
;)
Dyslexics are teople poo

Mammouth du PHP | 736 Messages

10 août 2011, 17:16

P'tites modifs
<?php 

//peut servir pour compléter chaque ligne du batch
$path='';

//fonction principale
function scan($repertoire) {
	$monrepertoire = opendir($repertoire) or die("Erreur de listage : le répertoire n'existe pas"); 
		
		while($element = @readdir($monrepertoire)) {
			
			//on teste si l'élément est bien un répertoire
			if(is_dir($repertoire.'/'.$element) && $element != '.' && $element != '..') {				

				//on peaufine la ligne du batch en chuintant, remplacant...
				$modifs = substr($repertoire.'\\'.$element,2,4000);
				
				//on écrit la ligne de commande qui sera sauvegardée
				$final = 'move '.$modifs.' B';//B étant mon dossier de destination	
			
				//on crée et incrémete le fichier copie.bat
				$bat = fopen("copie.bat", "a+"); 
				fwrite($bat, $final."\n");   
				fclose($bat);
				
				//récursivité pour avoir autant de lignes de commande que de dossiers
				scan($repertoire.'\\'.$element);
			}
	
	}
	
	closedir($monrepertoire);
}

//appel initial
scan('.');

if(file_exists('copie.bat')){
echo 'fichier .bat généré';	
}
?>
Je pense qu'il reste une chose à faire, mettre tout dans un tableau et alimenter le fichier en faisant un tri inverse à moins qu'on puisse trier le fichier txt ou lancer le .bat depuis la fin, c'est possible ou array solution ?
Dyslexics are teople poo

Mammouth du PHP | 19639 Messages

10 août 2011, 17:48

Salut,
je n'ai pas regardé pour la question que tu as posé, en revanche, je vais faire mon difficile :P

C'est quoi cette indentation de barbare et ces lignes vides un peu anarchiques ? ? Tant qu'à citer Albat, je vais assumer pleinement le fait qu'il m'ait un jour, il y a fort longtemps, qualifié de « méticuleur de mouches » Et nous sommes sur un forum public souvent parcouru par des développeurs de tous niveaux, incluant pas mal de débutants. Donc il me semble qu'on a le devoir de leur montrer l'exemple en écrivant proprement nos lignes de codes. Je reprends donc ton code avec une remise en forme et une seule toute petite modification en mode strict :)
<?php
/**
 * peut servir pour compléter chaque ligne du batch
 */
$path='';

/**
 * fonction principale
 *
 * @param   String  $repertoire
 */
function scan($repertoire)
{
    $monrepertoire = opendir($repertoire) or die("Erreur de listage : le répertoire n'existe pas");
    while(false !== ($element = readdir($monrepertoire)))
    {
        //on teste si l'élément est bien un répertoire
        if(is_dir($repertoire.'/'.$element) && $element != '.' && $element != '..')
        {
            //on peaufine la ligne du batch en chuintant, remplacant...
            $modifs = substr($repertoire.'\\'.$element,2,4000);

            //on écrit la ligne de commande qui sera sauvegardée
            $final = 'move '.$modifs.' B';//B étant mon dossier de destination

            //on crée et incrémete le fichier copie.bat
            $bat = fopen("copie.bat", "a+");
            fwrite($bat, $final."\n");
            fclose($bat);

            //récursivité pour avoir autant de lignes de commande que de dossiers
            scan($repertoire.'\\'.$element);
        }
    }
    closedir($monrepertoire);
}

/**
 * appel initial
 */
scan('.');

if(file_exists('copie.bat'))
{
    echo 'fichier .bat généré';
}
?>
Me semble que de cette manière, j'ai moins de mal à le lire :)

My 2¢ :langue:
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Administrateur PHPfrance
Administrateur PHPfrance | 11405 Messages

10 août 2011, 19:57

Z'avez vu ? Y a une mouche qui vient de passer, en se frottant les fesses... :lol:

Mammouth du PHP | 19639 Messages

11 août 2011, 00:37

Z'avez vu ? Y a une mouche qui vient de passer, en se frottant les fesses... :lol:
Je te laisse imaginer ce que ça pourrait être si je devenais un jour « méticuleur de coccinelles » :-*

Enfin bon, je dis ça hein... :langue:
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 736 Messages

11 août 2011, 00:59

<MODE POURRI ON>
C'est pas moi c'est Albat qui m'a braqué un pistolet sur la tempe et qui m'a forcé à coder comme ça, j'étais pas d'accord !!!!!!!!!!!!!!!!!! (y a assez de ! On y croit là ?)
<MODE POURRI OFF>

<MODE ILLUMINE ON>
Ouep c'est une vieille indentation ancestrale qui me vient des mayas mais vous pouvez pas comprendre, moi même déjà c'est dur alors des pisseurs de lignes...
<MODE ILLUMINE OFF>

<MODE HUMBLE ON>
MERCI pour la claque derrière la tête, ça fait du bien de temps en temps et je suis pas que MASO, à bon entendeur :)
<MODE HUMBLE OFF>

Bah là je vais aller me pieuter mais je posterai la version finale via l'array depuis le code de sieur de bergerac.

Bonne nuit !
:sleeping:
Dyslexics are teople poo

Mammouth du PHP | 19639 Messages

11 août 2011, 01:03

<MODE ILLUMINE ON>
Ouep c'est une vieille indentation ancestrale qui me vient des mayas mais vous pouvez pas comprendre, moi même déjà c'est dur alors des pisseurs de lignes...
<MODE ILLUMINE OFF>
Celle-là j'y crois déjà davantage, d'ailleurs, en fréquentant Albat qui m'a déjà narré quelques souvenirs de codage en Lisp, pouvait-il en être autrement... :langue:
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 736 Messages

12 août 2011, 10:14

Bonjour,

Quelqu'un peut-il me dire pourquoi mon array est vide ?
<?php
/**
 * peut servir pour compléter chaque ligne du batch
 */
$path='';
$arr = array();
/**
 * fonction principale
 *
 * @param   String  $repertoire
 */
function scan($repertoire)
{
    $monrepertoire = opendir($repertoire) or die("Erreur de listage : le répertoire n'existe pas");
    while(false !== ($element = readdir($monrepertoire)))
    {
        //on teste si l'élément est bien un répertoire
        if(is_dir($repertoire.'/'.$element) && $element != '.' && $element != '..')
        {
            //on peaufine la ligne du batch en chuintant, remplacant...
            $modifs = substr($repertoire.'\\'.$element,2,4000);

            //on écrit la ligne de commande qui sera sauvegardée
            $final = 'move '.$modifs.' B';//B étant mon dossier de destination

			$arr[]=$final;
            
            //récursivité pour avoir autant de lignes de commande que de dossiers
            scan($repertoire.'\\'.$element);
        }
    }
    closedir($monrepertoire);
}

/**
 * appel initial
 */
scan('.');

if(file_exists('copie.bat'))
{
    echo 'fichier .bat généré';
}

echo '<pre>';
print_r($arr);
echo '</pre>';

/*on crée et incrémete le fichier copie.bat
$bat = fopen("copie.txt", "a+");
fwrite($bat, $final."\n");
fclose($bat);*/
?>
alors que si je fais dans un fichier à part
<?php 
$arr = array();

//on écrit la ligne de commande qui sera sauvegardée
$final = 'move dos3\*.* dossier de destination';	

$arr[]=$final;

echo '<pre>';
print_r($arr);
echo '</pre>';

?>
Ca fonctionne #-o

Mega
;)
Dyslexics are teople poo

Mammouth du PHP | 19639 Messages

12 août 2011, 10:19

Indice : portée des variables non globales... :-k

Pour que ton truc fonctionne, il manque un paramètre à ta fonction scan() et du coup un retour aussi.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 736 Messages

12 août 2011, 10:59

Bonjour et merci Cyrano,

Ok j'ai mis $arr en argument de cette façon.
$arr = array(); 

function scan($repertoire,$arr)
{
    $arr[]=$final;
}

scan('.',$arr);
mais rien n'y fait :?

On peut p'tet pas passer un array de cette façon...

Mega
;)
Dyslexics are teople poo

Mammouth du PHP | 19639 Messages

12 août 2011, 11:30

Et le retour ?

La portée d'une variable :lorsqu'elle est définie à l'extérieur d'une fonction, elle n'est pas « visible » depuis l'intérieur d'une fonction donc en la mettant en paramètre dans l'appel, on peut la rendre accesible et modifiable.
L'inverse est tout aussi vrai, et donc pour la voir depuis l'extérieur, il faut que la fonction la retourne.

CQFD... :-*
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 736 Messages

12 août 2011, 14:39

C'est pas ce que j'ai fait ?

Excuse moi, là, je sèche :(

Mega
;)
Dyslexics are teople poo

Mammouth du PHP | 736 Messages

12 août 2011, 14:54

Ah je crois que tu fais référence à l'appel récursif du scan donc j'ai fait ceci :
//récursivité pour avoir autant de lignes de commande que de dossiers
scan($repertoire.'\\'.$element,$arr);
Je n'ai plus le message d'erreur mais mon tableau est toujours vide :?

C'est mieux avec
global $arr;
$arr[]=$final;
:D
Dyslexics are teople poo

ViPHP
ViPHP | 5462 Messages

14 août 2011, 21:40

a quoi ça sert a part de faire la même chose que rename mais en moins bien et plus compliqué ?

Mammouth du PHP | 736 Messages

15 août 2011, 17:05

Salut,

Je ne te suis pas...

Mega
;)
Dyslexics are teople poo