Lister contenu d'un repertoire avec tailles fichiers et dossiers

Signaler
Messages postés
37
Date d'inscription
samedi 16 septembre 2006
Statut
Membre
Dernière intervention
5 juillet 2012
-
Messages postés
1309
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
5 juin 2013
-
Bonjour à tous !
J'ai codé il n'y a pas très longtemps ce script me permettant d'afficher le contenu d'un répertoire (ici $path) en indiquant pour chaque ligne s'il s'agit d'un fichier ou d'un dossier ainsi que sa taille.
Je précise également que le script n'est pas dans le répertoire concerné.

Ce qui m'amène à vous exposer mes problèmes étant débutant :
[list]
[*] Les tailles
Ma fonction mille($nb) fonctionne parfaitement sauf pour les tailles en Go, cela m'affiche à chaque fois une valeur en octets, et négative...

[*] Les chemins
Dès que le nom d'un fichier ou dossier contient un accent ou un caractère spécial (+,&,etc...), impossible d'afficher le contenu. Quel est la fonction permettant de résoudre cela ?

[*] Le tri
J'ai vainement essayé de trier tout ça par ordre alphabétique, mais je ne suis arrivé à rien de très concluant, j'ai donc aussi besoin d'un coup de patte à ce sujet =)
/list

Merci d'avoir pris le temps de me lire, Je reste disponible pour de plus amples informations.

Voici donc le script qui, je sais, est pas forcément bien programmé, ni indenté, ni sécurisé
<?php
function sizethis($src)
{
$size=0;

$h = opendir($src);
while (($o = readdir($h)) !== FALSE)  
{
if (($o != '.') and ($o != '..'))   
{
if (is_dir($src.DIRECTORY_SEPARATOR.$o))
{
$size=$size + sizethis($src.DIRECTORY_SEPARATOR.$o);
}
else
{
$size=$size+filesize($src.DIRECTORY_SEPARATOR.$o);
}
}
}
closedir($h);
return $size;
} 

function mille($nb)
{
if ($nb<1024) return $nb." Octets";
else if ($nb<1048576) return round($nb/1024)." Ko";
else if ($nb<1073741824) return round($nb/1048576,1)." Mo";
else return round($nb/1073741824,2)." Go";
}

echo "
<html>
<head>
<title>Listing</title>
</head>
                                                                                                       
Listing du répertoire
,

\";
if($_GET['chemin']==NULL)
{
$path='repertoire_a_lister';
}
else
{
$path=$_GET['chemin'];
}

$handle=opendir($path);while (false !($file readdir($handle)))

if ($file!='.' && $file!='..' && strtoupper(substr($file,-3)) != \"PHP\")
{
if (is_dir($path.DIRECTORY_SEPARATOR.$file))
{
$size=sizethis($path.DIRECTORY_SEPARATOR.$file);
$dossier.=\"
----

 $file,
".mille($size).",
\";
}
else
{
$size=filesize($path.DIRECTORY_SEPARATOR.$file);$dir=\"\";
$fichier.=\"
----

 $file,
".mille($size).",
\";
}
$total+=$size;
}
echo $dossier.$fichier.\"
----
,
----

TOTAL : |".mille($total)." |

";                                                                                                   
?>

1 réponse

Messages postés
1309
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
5 juin 2013
12
Salut,

# Les tailles
Ma fonction mille($nb) fonctionne parfaitement sauf pour les tailles en Go, cela m'affiche à chaque fois une valeur en octets, et négative...

Débordement des capacités de l'entier, c'est classique. Je te conseille de lire ce que la doc précise a ce sujet:
Note: Comme le type entier de PHP est signé et que de nombreuses plates-formes utilisent des entiers de 32 bits, filesize() peut retourner des résultats étranges pour les fichiers de taille supérieure à 2 Go. Pour les fichiers entre 2 et 4 Go, cela peut être contourné avec sprintf("%u", filesize($file)).


# Les chemins
Dès que le nom d'un fichier ou dossier contient un accent ou un caractère spécial (+,&,etc...), impossible d'afficher le contenu. Quel est la fonction permettant de résoudre cela ?

Vérifie l'encodage. Dans un cas classique, l'utilisation de utf8_decode() ou utf8_encode() résoud le soucis.

# Le tri
J'ai vainement essayé de trier tout ça par ordre alphabétique, mais je ne suis arrivé à rien de très concluant, j'ai donc aussi besoin d'un coup de patte à ce sujet =)

En utilisant scandir() ou une instance de la classe Directory tu aurai tout dans l'ordre directement. Sinon si tu veux conserver ton système, tu peux tout stocker dans un tableau puis utiliser une fonction de tri dessu.