Lister toute l'arborescence d'un dossier en vue d'un upload

Bonjour,
Je souhaite faire une petite page en php me permettant d’uploader des fichiers dans les dossiers ou sous-dossiers que je souhaite.
En ce qui concerne la partie upload, pas de souci.
Là où je bloque, c’est lister les dossiers et sous dossiers d’un répertoire en les faisant s’afficher correctement, dans le but d’en faire choisir un seul à l’utilisateur.

Exemple
Je souhaiterai faire afficher quelque chose comme ça:
1
.1-1
…1-1-1
…1-1-2
.1-2
.1-3
2
.2-1

Alors que pour l’instant je ne fais afficher que ça:
1
1-1
1-1-1
1-1-2
1-2
1-3
2
2-1

Ce qui vous l’avouerez n’est pas très lisible, surtout que mes dossiers ne se nommeront bien sur pas 1 ou 1-1 …

Voilà mon code:



<?php

function ListFolder($Folder, $SkipObjects) // Fonction pour lister les dossiers
{
$dir = opendir($Folder);
while (false !== ($Current = readdir($dir))) // Boucle sur tout ce qu'il y a dans le répertoire
{
 if ($Current !='.' && $Current != '..' && in_array($Current, $SkipObjects)===false)
 {
 if(is_dir($Folder.'/'.$Current)) // Si c'est un dossier
 {
 echo '<strong style="color: #ff0000;">'.$Current.'</strong><br>';
 ListFolder($Folder.'/'.$Current, $SkipObjects); // On liste les dossiers contenue dans le dossier (récursivité)
 }

 }
}
closedir($dir);
}


 $Folder = 'a';
 $SkipObjects = array('UnDossier', 'UnFichier');
 ListFolder($Folder, $SkipObjects);
 ?>


Je suis pas un dieu en récursivité…
Une idée?
Message edité le 01/02/2009 à 22:27


function listFolder( $folder, $skipObjects, $deep = 0 ) {

	$dir = opendir( $folder );

	while( $current = readder( $dir ) ) {
		if( is_dir( $folder.'/'.$current) && ! in_array( $current, array( '.', '..' ) ) && ! in_array( $current, $skipObjects ) ) {
			echo str_repeat( '& nbsp;', $deep );
			echo $current;
			listFolder( $folder.'/'.$current, $skipObjects, $deep++ );
		}
	}

}

$folder = 'a';
$skipObjects = array('UnDossier', 'UnFichier');
listFolder( $folder, $skipObjects );
?>

Edité le 31/01/2009 à 15:50

Ton code ne marche pas.
J’ai juste remplacé le ‘& nbsp;’ par ‘.’ et mis un echo"
";
après le echo$current; pour rendre le résultat plus lisible, et voilà ce que j’obtiens:

1
1-1
1-1-1
.1-1-2
.1-2
…1-3
.2
.2-1

Autant pour moi, remplace $deep ++ par $deep + 1 :slight_smile:

Impec! Ca marche…

Je n’arrive pas à saisir exactement ce que tu as fait.
Pourrais-tu me l’expliquer? (si tu n’as pas le temps, ce n’est pas grave).

Dans tous les cas, merci!

En mieux :


function listFolder( $folder, $skipObjects) {
	$dir = opendir( $folder );
       if ($dir === false) return; // devrait planter autrement
       $hasEntry = false;
	while( $current = readdir( $dir ) ) {
		if( is_dir( $folder.'/'.$current) && ! in_array( $current, array( '.', '..' ) ) && ! in_array( $current, $skipObjects ) ) {
			if (!$hasEntry) {
				echo '<ul>';
				$hasEntry = true;
			}
			echo '<li>', $current;
			listFolder( $folder.'/'.$current, $skipObjects);
			echo '</li>';
		}
	}
       closedir($dir);
       if ($hasEntry) {
              echo '</ul>';
       }
}

$folder = 'a';
$skipObjects = array('UnDossier', 'UnFichier');
listFolder( $folder, $skipObjects );
?>

J’ai aussi ajouté un closedir() histoire de fermer le pointeur à la fin…

J’avais zappé le closedir() pdt mon c/c :stuck_out_tongue:

Je passe à la deuxième étape… et je sèche à nouveau.

J’ai inséré un bouton radio pour chaque dossier et j’ai lancé la fonction dans un form.


function listFolder( $folder, $skipObjects) {
	$dir = opendir( $folder );
	if ($dir === false) return; // devrait planter autrement
	$hasEntry = false;
	while( $current = readdir( $dir ) ) {
		if( is_dir( $folder.'/'.$current) && ! in_array( $current, array( '.', '..' ) ) && ! in_array( $current, $skipObjects ) ) {
			if (!$hasEntry) {
				echo '<ul>';
				$hasEntry = true;
			}
			
			echo '<li>';
			echo "<input type ='radio' name ='destination' unchecked value=$current />";
			echo $current;
			listFolder( $folder.'/'.$current, $skipObjects);
			echo '</li>';
		}
	}
	closedir($dir);
	if ($hasEntry) {
	echo '</ul>';
	}
	}

Mais le problème c’est que si je sélectionne le dossier nommé 1-2, le bouton radio aura pour valeur $current, c’est à dire 1-2
Alors qu’il faudrait qu’il ait comme valeur quelque chose du type /1/1-2/
Bref, je me demande à présent si je suis parti du bon pied!
Edité le 31/01/2009 à 17:26

Colle $folder.’/’.$current comme valeur.

–> echo ‘<input type=“radio” name=“destination” value="’, $folder, ‘/’, $current, ’ />’;

Yes!!!

J’ai du mal…:frowning:

Merci pour votre aide conjointe!

J’ai honte, mais j’avais essayé de le faire hier, et je n’y suis pas arrivé!
J’ai édité mon premier message, mis [Résolu] dans le titre, cliqué sur Envoyer, mais ça me garde le titre initial.

Comment faut-il faire?

ps: tu as raison, c’est important d’indiquer lorsque une soluce a été trouvée, pour faciliter la recherche de futurs internautes…

Pour cela, faut ajouter un tag Résolu (en éditant ton post, tout simplement); 'fin ça marche bizarrement. :confused:
Edité le 01/02/2009 à 22:27