8768 sujets

Développement web côté serveur, CMS

Bonjour à tous;

je planche sur un problème depuis 15 jours déjà;
je cherche à lister l'arborescence des fichiers (PDF exclusivement) et dossiers contenus dans un dossier sur mon serveur.
C'est une arborescence à 2,3 voir 4 niveaux.
Pour ce faire, j'ai modifier un bout de code que j'ai trouver sur le net et qui marche bien jusque là.


function exploration_dossier($dossier_chemin){
    echo "<ul>";    
    $dossier = opendir ($dossier_chemin);     
    while ($fichier_nom = readdir ($dossier)) {    
        if ($fichier_nom != "." && $fichier_nom != "..") {
            $fichier_chemin = $dossier_chemin.'/'.$fichier_nom;
         
//test dossier
           if (substr_count($fichier_nom, '.') == "0" && substr_count($fichier_nom, '0')== "0"){
           $h ='<h2 class="title"><u>';
           $hf = '</u></h2>';
                      }
 //test fichier pdf
           if (substr_count($fichier_nom, 'pdf') != "0"){
            $str= " <li><a href=affichage.php?get=$dossier_chemin/$fichier_nom&name=$fichier_nom>$fichier_nom</a></li>";
            }
            else { 
           $str= "<li>$h $fichier_nom $hf</li>"; 
            }
echo $str;
            if(filetype($fichier_chemin) == 'dir'){                
                exploration_dossier($fichier_chemin);               
            }        
        }
    } 
    closedir ($dossier);     
    echo "</ul>";    
} 


mon problème est le suivant: il faut que je trie ces fichiers PDF et les dossiers qui les contiennent de cette façon:

2008
- A08.pdf
-B08.pdf
-- 1208
--- A1208.pdf
--- B1208.pdf
--1108
--- A1108.pdf
--- B1108.pdf

2007
-A07.pdf
-B07.PDF
--1207
---A1207.pdf
---B1207.pdf
--1107
---A1107.pdf
---B1107.pdf


2006
-A06.pdf
-B06.pdf

...

j'ai penser a insérer des tableaux pour les fichiers et un autre pour les dossiers mais je ne voit pas comment faire la relation entre tel fichier qui va dans tel sous dossier et en plus il faut que je garde les liens des fichiers PDF.. Smiley decu

j'ai vrémentbesoin d'aide là merci Smiley biggrin
Modifié par jeremyVS (10 Sep 2008 - 12:21)
Salut jeremyVS et bienvenue Smiley cligne ,

tu pourrais essayer ça :
<?php
class listFiles {

	private $extension	= '';		// extension des fichiers à lister
	private $current_path	= '';		// chemin du répertoire en cours
	private $dirs_in_dir	= array();	// tableau des répertoires d'un répertoire
	private $files_in_dir	= array();	// tableau des fichiers d'un répertoire

	public function listFiles($Path = '.', $extension = 'pdf') {
		$this->extension = $extension;
		$this->listDirs($Path);
	}
	private function listDirs($Current_Path) {
		$this->current_path = $Current_Path;
		$this->dirs_in_dir = array();
		$this->files_in_dir = array();
		if ($handle = opendir($Current_Path)) {
			while (false !== ($file = readdir($handle))) {
				if ($file != "." && $file != "..") {
					$path = $Current_Path.'/'.$file;
					if (is_dir($path)) {
						$this->dirs_in_dir[]=$path;
					} else {
						$this->files_in_dir[]=$file;
					}
				}
			}
		}
		closedir($handle);
		$this->display();
	}
	private function display() {
		$nb_files = count($this->files_in_dir) > 0;
		$nb_dirs  = count($this->dirs_in_dir) > 0;
		if($nb_files || $nb_dirs) {
			echo '<ul>'."\n";
			// Si des fichiers existent...
			if($nb_files) {
				$this->displayFiles();
			}
			// Si des dossiers existent...
			if($nb_dirs) {
				$this->displayDirs();
			}
			echo '</ul>'."\n";
		}
	}
	private function displayFiles() {
		foreach ($this->files_in_dir as $file) {
			$pathinfo = pathinfo($file);
			if ($pathinfo['extension'] == $this->extension) {
				$href = $this->current_path.'/'.$file;
				echo '<li><a href="'.$href.'">'.$file.'</a></li>'."\n";
			} else {
				echo '<li>'.$file.'</li>'."\n";
			}
		}
	}
	private function displayDirs() {
		// Tri inverse
		rsort($this->dirs_in_dir);
		foreach ($this->dirs_in_dir as $dir) {
			echo '<li><h2 class="title">'.substr(strrchr($dir, "/"), 1).'</h2>';
			$this->listDirs($dir);
			echo '</li>'."\n";
		}
	}
}
//$listFiles = new listFiles(); 
//$listFiles = new listFiles('repert');
//$listFiles = new listFiles('repert1/repert2');
//$listFiles = new listFiles('repert1/repert2', 'ext');
?>

A+
Modifié par Heyoan (09 Sep 2008 - 11:35)
Salut, j'ai bien testé ton code mais il me laisse une erreur:

Parse error: syntax error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in /home.10.23/courtoisu/www/test.php on line 7

et je ne voit pas pourquoi
jeremyVS a écrit :

et je ne voit pas pourquoi
Euh... moi non plus ! Tu es sûr que ce n'est pas un problème de copié / collé ?

Pour s'en assurer tu pourrais copier toute cette page et la placer telle quelle dans le répertoire 2008 :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Document sans titre</title>
</head>
<body>
<?php
class listFiles {
	private $extension		= '';		// extension des fichiers à lister
	private $current_path	= '';		// chemin du répertoire en cours
	private $dirs_in_dir	= array();	// tableau des répertoires d'un répertoire
	private $files_in_dir	= array();	// tableau des fichiers d'un répertoire
	public function listFiles($Path = '.', $extension = 'pdf') {
		$this->extension = $extension;
		$this->listDirs($Path);
	}
	private function listDirs($Current_Path) {
		$this->current_path = $Current_Path;
		$this->dirs_in_dir = array();
		$this->files_in_dir = array();
		if ($handle = opendir($Current_Path)) {
			while (false !== ($file = readdir($handle))) {
				if ($file != "." && $file != "..") {
					$path = $Current_Path.'/'.$file;
					if (is_dir($path)) {
						$this->dirs_in_dir[]=$path;
					} else {
						$this->files_in_dir[]=$file;
					}
				}
			}
		}
		closedir($handle);
		$this->display();
	}
	private function display() {
		$nb_files = count($this->files_in_dir) > 0;
		$nb_dirs  = count($this->dirs_in_dir) > 0;
		if($nb_files || $nb_dirs) {
			echo '<ul>'."\n";
			// Si des fichiers existent...
			if($nb_files) {
				$this->displayFiles();
			}
			// Si des dossiers existent...
			if($nb_dirs) {
				$this->displayDirs();
			}
			echo '</ul>'."\n";
		}
	}
	private function displayFiles() {
		foreach ($this->files_in_dir as $file) {
			$pathinfo = pathinfo($file);
			if ($pathinfo['extension'] == $this->extension) {
				$href = $this->current_path.'/'.$file;
				echo '<li><a href="'.$href.'">'.$file.'</a></li>'."\n";
			} else {
				echo '<li>'.$file.'</li>'."\n";
			}
		}
	}
	private function displayDirs() {
		// Tri inverse
		rsort($this->dirs_in_dir);
		foreach ($this->dirs_in_dir as $dir) {
			echo '<li><h2 class="title">'.substr(strrchr($dir, "/"), 1).'</h2>';
			$this->listDirs($dir);
			echo '</li>'."\n";
		}
	}
}
$listFiles = new listFiles(); 
//$listFiles = new listFiles('repert');
//$listFiles = new listFiles('repert1/repert2');
//$listFiles = new listFiles('repert1/repert2', 'ext');
?>
</body>
</html>

Modifié par Heyoan (10 Sep 2008 - 10:04)
même erreur:
Parse error: syntax error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in /home.10.23/courtoisu/www/doc/info_reglementees/Rapports/2008/index.php on line 19

je comprend pas il ne manque pas ni d' "{}" ni "()" ...
jeremyVS a écrit :
je suis chez OVH donc je suppose PHP5
après il faut que mes fichiers s'appellent .php ou .php5?
Il me semble que c'est .php

Sinon au lieu d'une class tu pourrais essayer avec une simple fonction :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Document sans titre</title>
</head>
<body>
<?php
function listDirs($Current_Path = '.', $extension = 'pdf') {
	$dirs_in_dir = array();
	$files_in_dir = array();
	if ($handle = opendir($Current_Path)) {
		while (false !== ($file = readdir($handle))) {
			if ($file != "." && $file != "..") {
				$path = $Current_Path.'/'.$file;
				if (is_dir($path)) {
					$dirs_in_dir[]=$path;
				} else {
					$files_in_dir[]=$file;
				}
			}
		}
	}
	closedir($handle);
	$nb_files = count($files_in_dir) > 0;
	$nb_dirs  = count($dirs_in_dir) > 0;
	if($nb_files || $nb_dirs) {
		echo '<ul>'."\n";
		// Si des fichiers existent...
		if($nb_files) {
			foreach ($files_in_dir as $file) {
				$pathinfo = pathinfo($file);
				if ($pathinfo['extension'] == $extension) {
					$href = $Current_Path.'/'.$file;
					echo '<li><a href="'.$href.'">'.$file.'</a></li>'."\n";
				} else {
					echo '<li>'.$file.'</li>'."\n";
				}
			}
		}
		// Si des dossiers existent...
		if($nb_dirs) {
			// Tri inverse
			rsort($dirs_in_dir);
			foreach ($dirs_in_dir as $dir) {
				echo '<li><h2 class="title">'.substr(strrchr($dir, "/"), 1).'</h2>';
				listDirs($dir);
				echo '</li>'."\n";
			}
		}
		echo '</ul>'."\n";
	}
}

listDirs(); 
//listDirs('repert');
//listDirs('repert1/repert2');
//listDirs('repert1/repert2', 'ext');
?>
</body>
</html>
en mettant les fichiers en .php5 sa fonctionne nikel.
par contreil classe pas les fichiers PDF dans l'ordre alors que les dossiers oui si ta une iD en attendant je vais chercher mais en tout cas merci BCP Smiley lol
jeremyVS a écrit :
en mettant les fichiers en .php5 sa fonctionne nikel.
par contreil classe pas les fichiers PDF dans l'ordre alors que les dossiers oui si ta une iD en attendant je vais chercher mais en tout cas merci BCP Smiley lol
Ah ? Il me semblait que les lectures d'un répertoire se faisait par ordre alphabétique par défaut. Smiley rolleyes

Mais il suffit de rajouter
	private function displayFiles() {
[b]		// Tri
		sort($this->files_in_dir);  [/b]
	foreach ($this->files_in_dir as $file) {


Et sinon pour .php et .php5 j'ai mis un .htaccess à la racine de mes sites sur OVH qui contient entre autre :
SetEnv PHP_VER 5

Si tu considères que ce sujet est [Résolu] merci de l'indiquer en éditant ton premier post et en modifiant le titre. Smiley cligne
You're welcome ! Smiley jap

Sinon le tag [résolu] est à rajouter dans le titre (voir mon lien du dessus). Smiley smile