Récupérer le chemin complet d'un fichier sur un serveur

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

04 sept. 2008, 23:13

Voici le contenu du message pour faire simple :
Voici un explorateur de dossiers et de fichiers d'un chemin disque donné.
Le résultat est une liste hiérarchique dont les noeuds principaux sont les dossiers et les noeuds finaux sont les fichiers.

Structure :
[lecteur ou chemin de départ]
|
|____ [sous dossier ]
|--------------|
|--------------|___ [0] fichier 0
|--------------|___ [N] fichier N
|
|____ [sous dossier N]
|--------------|
|--------------|___ [sous dossier 1]
|--------------|----------|
|--------------|----------|___ [0] fichier 0
|--------------|----------|___ [N] fichier N
|--------------|
|--------------|___ [sous dossier N]
|
|____ [0] fichier 0
|____ [N] fichier N

Programme php:
<?php
function explorer($dir="", $types="") { 
    $file_list = ''; 
    $stack[] = $dir; 
    while ($stack) { 
        $current_dir = array_pop($stack); 
		//Parcourir le dossier
        if ($dh = opendir($current_dir)) { 
            while (($file = readdir($dh)) !== false) { 
                if ($file !== '.' AND $file !== '..') { 
                    $current_file = "{$current_dir}/{$file}"; 
                    if (is_file($current_file)) {
						//Appliquer le filtre de sélection du fichier s'il existe
						if (!empty($types)){
							//correction du filtre pour l'expression réguliaire. format attendu:(ext|ext|...)
							$types = preg_replace("#\.#"," ", $types); //éliminer les .
							$types = trim(preg_replace("#,+|;+|\s+|\++#","|", $types)); //remplacer séparateurs possibles par |
							if (eregi(".($types)$", $file)) $file_list["$current_dir"][] = "{$current_dir}/{$file}"; //sélection filtrée
						}
						else $file_list["$current_dir"][] = "{$current_dir}/{$file}"; //sélection sans filtrage
						
                    } elseif (is_dir($current_file)) {
						//Pour explorer le sous-dossier 
                        $stack[] = $current_file; 
                    } 
                } 
            } 
        } 
    } 
    return $file_list; 
}
function trier($file_list=array(), $ordre="ASC"){
	//Trier la liste par l'ordre donné (par défaut ASC: croissant)
	if ($file_list && is_array($file_list)){
		if (strtoupper($ordre)!= "DESC") array_multisort($file_list, SORT_ASC);
		else array_multisort($file_list, SORT_DESC);
	}
	return $file_list;
}

//Test
if (!$_GET["dir"]) {
    //Rappel de l'usage correct (paramètres obligatoires)
	echo "<p><b><u>Usage:</u></b> explorer.php?dir=lecteur:[/dossier/dossier/...][&types=ext|ext|...][&ordre=ASC|DESC]";
	exit;
}
//Explorer et trier le chemin donné
$dir = trier(explorer($_GET["dir"], $_GET["types"]), $_GET["ordre"]); //paramètres reçus du navigateur
//Afficher le résultat
echo "<pre><h1>Contenu de $_GET[dir]</h1>";
print_r($dir);
echo "</pre>";

?>
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphanteau du PHP | 38 Messages

05 sept. 2008, 06:39

Question : Pourquoi utiliser eregi() ? preg_match() est pourtant plus rapide, et s'il a plusieurs fichiers, ça peut influencer un peu la rapidité du script non ?

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

05 sept. 2008, 10:34

Voici la mise à jour de ce script pour qui ça intéresse :
<?php
function explorer($dir="", $types="") { 
    $file_list = ''; 
    $stack[] = $dir; 
    while ($stack) { 
        $current_dir = array_pop($stack); 
        //Parcourir le dossier
        if ($dh = opendir($current_dir)) { 
            while (($file = readdir($dh)) !== false) { 
                if ($file !== '.' AND $file !== '..') { 
                    $current_file = "{$current_dir}/{$file}"; 
                    if (is_file($current_file)) {
                        //Appliquer s'il existe, le filtre de sélection du fichier
                        if (!empty($types)){
                            //correction du filtre pour l'expression régulière. format attendu:(ext|ext|...)
                            $types = preg_replace("#\.#"," ", $types); //éliminer les .
                            $types = trim(preg_replace("#,+|;+|\s+|\++#","|", $types)); //remplacer séparateurs possibles par |
                            //sélection filtrée
							if (!preg_match("#.($types)$#", $file)) continue;
                        }
                        //
						$file_list["$current_dir"][] = array ( 
									"url" => "{$current_dir}/{$file}" , 
									"infos" => pathinfo("{$current_dir}/{$file}") ,									
									"size" => filesize("{$current_dir}/{$file}"),
									"date_modif" => date("d-m-Y H:i:s", filemtime("{$current_dir}/{$file}")),
									"perms" => getPermissions("{$current_dir}/{$file}"),
								); 
                        
                    } elseif (is_dir($current_file)) {
                        //Pour explorer le sous-dossier 
                        $stack[] = $current_file; 
                    } 
                } 
            } 
        } 
    } 
    return $file_list; 
}
function trier($file_list=array(), $ordre="ASC"){
    //Trier la liste par l'ordre donné (par défaut ASC: croissant)
    if ($file_list && is_array($file_list)){
        if (strtoupper($ordre)!= "DESC") array_multisort($file_list, SORT_ASC);
        else array_multisort($file_list, SORT_DESC);
    }
    return $file_list;
}
function getPermissions($file){
if (!file_exists($file)) return null;
$perms = fileperms($file);
//
if (($perms & 0xC000) == 0xC000) {
    // Socket
    $info = 's';
} elseif (($perms & 0xA000) == 0xA000) {
    // Lien symbolique
    $info = 'l';
} elseif (($perms & 0x8000) == 0x8000) {
    // Régulier
    $info = '-';
} elseif (($perms & 0x6000) == 0x6000) {
    // Block spécial
    $info = 'b';
} elseif (($perms & 0x4000) == 0x4000) {
    // Dossier
    $info = 'd';
} elseif (($perms & 0x2000) == 0x2000) {
    // Caractère spécial
    $info = 'c';
} elseif (($perms & 0x1000) == 0x1000) {
    // FIFO pipe
    $info = 'p';
} else {
    // Inconnu
    $info = 'u';
}

// Propriétaire
$info .= (($perms & 0x0100) ? 'r' : '-');
$info .= (($perms & 0x0080) ? 'w' : '-');
$info .= (($perms & 0x0040) ?
            (($perms & 0x0800) ? 's' : 'x' ) :
            (($perms & 0x0800) ? 'S' : '-'));

// Groupe
$info .= (($perms & 0x0020) ? 'r' : '-');
$info .= (($perms & 0x0010) ? 'w' : '-');
$info .= (($perms & 0x0008) ?
            (($perms & 0x0400) ? 's' : 'x' ) :
            (($perms & 0x0400) ? 'S' : '-'));

// Tous
$info .= (($perms & 0x0004) ? 'r' : '-');
$info .= (($perms & 0x0002) ? 'w' : '-');
$info .= (($perms & 0x0001) ?
            (($perms & 0x0200) ? 't' : 'x' ) :
            (($perms & 0x0200) ? 'T' : '-'));

return $info;
}
//Test
if (!$_GET["dir"]) {
    //Rappel de l'usage correct (paramètres obligatoires)
    echo "<p><b><u>Usage:</u></b> explorer.php?dir=lecteur:[/dossier/dossier/...][&types=ext|ext|...][&ordre=ASC|DESC]";
    exit;
}
//Explorer et trier le chemin donné
$dir = trier(explorer($_GET["dir"], $_GET["types"]), $_GET["ordre"]); //paramètres reçus du navigateur
//Afficher le résultat
echo "<pre><h1>Contenu de $_GET[dir]</h1>";
print_r($dir);
echo "</pre>"; 
?>
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Petit nouveau ! | 4 Messages

05 sept. 2008, 11:30

Bonjour Sadeq,

Merci beaucoup pour ta réponse et la correction du script.
Ta proposition répond parfaitement au besoin que j'exprime.
Je vais la mettre en balance avec la solution proposée par @rthur.

Merci encore :)
Cordialement,
LS