Tri de fichier en fonction du type (dossier/fichier)

Eléphant du PHP | 291 Messages

12 nov. 2005, 13:41

Bonjour,

J'ai utilisé differents petit bout de script que j'ai trouvé en parcourant le forum pour faire un petit explorateur de dossier tout simple pour qu'il affiche une image en fonction du type (dossier/fichier), le nom du fichier, la date de dernière modification, et son poid (en Oc, Ko ou Mo)

Pour cela j'utilise une boucle While, pour faire le tri en fait je voudrais combiner 2 tri, le premier en fonction du type et le second par ordre alphabetique : ex:

Dossier_1
Dossier_2
Dossier_3
Fichier_1
Fichier_2

Je pense qu'il faut faire un tableau mais je pense que ce n'est pas compatible avec ce que j'ai deja fait, pouvez vous m'aider ?

voila lecode :
<?php
session_name('gesten'); 
session_start();

// Condition sinon redirection
	if(!session_is_registered('id')){
	
		header("Location: ./index.php?erreur=4");
		exit;
	}

// Insertion du fichier admin/conf/conf.php
include ("conf/conf.php");
require ("conf/fonction.php");

// Récuperation de dir dans URL
$var_url = $_GET['dir'];

// Condition pour dir
if ($var_url != "") {
$dir = $var_url;
} else {
$dir = "./data/societe/";
}
?>
<br>
<table width="60%" border="0" align="center" width="80%">
<tr>
<td>
<fieldset>
<legend>Documents officiels de la société</legend>

<table width="100%"  border="0" cellspacing="0" cellpadding="0">
  <tr>
    <td width="21%"><div align="center"></div></td>
	<td width="11%"><div align="center">Nom</div></td>
    <td width="53%"><div align="center">Derni&egrave;re modification </div></td>
    <td width="15%"><div align="center">Taille</div></td>
  </tr>
  <tr>
    <td colspan="4"><hr></td>
  </tr>
  <tr>
    <td><div align="center"><?php
	
	if ($var_url != "") {
	echo '<a href="javascript:history.go(-1)"><img src="./images/design/retour.gif" border="0" /> Retour</a>';
	echo "<br>";
	} else {
	}
?>
	</div></td>
    <td>&nbsp;</td>
	<td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>

<?php
if (is_dir($dir)) {
   if ($dh = opendir($dir)) {
       while (($file = readdir($dh)) !== false) {
	   
		   if ($file != "." && $file != "..") {
		   			
					// Découpe le nom de fichier en fonction du . si present
					$fichier = explode(".", $file);
					
					// Determine le type (dir ou file)
					//$type = filetype($dir . $file);
					// OU
					//echo is_dir ($dir); // Donne 1 si fichier
										
					// Conversion de Octet en Ko et Mo
					$octet = filesize($dir . $file);
					$ko = $octet/1024;
					$mo = $ko/1024;
					$ako = sprintf ("%0.2f","$ko");
					$amo = sprintf ("%0.2f","$mo"); 
					
					$der_upd = filemtime($dir . $file);
					
					// Dernier update
					$anneel=substr($der_upd, 0, 4);
					$moisl=substr($der_upd, 5, 2);
					$jourl=substr($der_upd, 8, 2);
					$heurel=substr($der_upd, 11, 2);
					$minutel=substr($der_upd, 14, 2);
					$secondel=substr($der_upd, 17, 2);
					
					$der_up = date("Y-m-d G:i",$der_upd);
?>
  <tr>
    <td><div align="center"><?php
	// Affichage de l'icone
			if (filetype($dir . $file) == "dir") {
				echo '<img src="./images/design/dossier.gif" />';
			} else {
				echo '<img src="./images/design/fichier.gif" />';
			}
	?></div></td>
	<td><?php

			// Affichage des dossier / fichier
			if (filetype($dir . $file) == "file") {
				//header("Content-type: application/force-download");
				echo '<a href="' . $dir . $file . '">' . $file ;
			} elseif (filetype($dir . $file) == "dir") {
				echo '<a href="accueil.php?page=document_societe&dir=' . $dir . $file . '/">' . $file ;
			} else {
			}
?>
	</td>
	
    <td><div align="center"><?php echo "Le " . dateFR($der_up) ; ?></div></td>
    <td><div align="center"><?php 
									if ($ako == "0.00") {
										echo "";
									} elseif ($ako < 1024) {
										echo $ako . " Ko";
									} elseif ($ako > 1024) {
										echo $amo . " Mo";
									} else {
									}
?>
	</div></td>
  </tr>
<?php
// Fermeture des condition et fermeture du dossier
}
	   	}
       closedir($dh);
   }
}
?>
</table></fieldset><br></td></tr></table>
D'avance merci

ViPHP
fab
ViPHP | 2657 Messages

12 nov. 2005, 14:24

$array_dir = array();
		$array_files = array();
		$open = opendir($dir);
		while($read = readdir($open))
		{
			$file = $dir . '/' .$read;
			$file = is_dir($file) ? array_push($array_dir,$read) : array_push($array_files,$read);
		}
		sort($array_dir);
		sort($array_files);
et apres tu fais un for sur array_dir et array_files dans l'ordre que tu veux :)
Seul l'intelligent a le pouvoir de se trouver con
try { work(); } catch(FlemmeExeption $e) { sleep(84600); }

Eléphant du PHP | 291 Messages

12 nov. 2005, 16:43

merci, ca fonctionne mais j'ai toujours autant de mal avec les boucle for ducoup mon filesize() et filetime() ne fonctinne plus

voila le code :
<?php
// Insertion du fichier admin/conf/conf.php
include ("conf/conf.php");
require ("conf/fonction.php");

// Récuperation de dir dans URL
$var_url = $_GET['dir'];

// Condition pour $dir
if ($var_url != "") {
$dir = $var_url;
} else {
$dir = "./data/societe/";
}

		$array_dir = array();
        $array_files = array();
        $open = opendir($dir);
        while($read = readdir($open))
        {
            $file = $dir . '/' .$read;
            $file = is_dir($file) ? array_push($array_dir,$read) : array_push($array_files,$read);
		
		}
		sort($array_dir);
        sort($array_files);
		
		//print_r ($array_dir);
		//print_r ($array_files);
		
		   			
					
					// Découpe le nom de fichier en fonction du . si present
					$fichier = explode(".", $file);
					
					// Conversion de Octet en Ko et Mo
					$octet = filesize($dir . $file);
					$ko = $octet/1024;
					$mo = $ko/1024;
					$ako = sprintf ("%0.2f","$ko");
					$amo = sprintf ("%0.2f","$mo"); 
					
					$der_upd = filemtime($dir . $file);
					
					// Dernier update
					$anneel=substr($der_upd, 0, 4);
					$moisl=substr($der_upd, 5, 2);
					$jourl=substr($der_upd, 8, 2);
					$heurel=substr($der_upd, 11, 2);
					$minutel=substr($der_upd, 14, 2);
					$secondel=substr($der_upd, 17, 2);
					
					$der_up = date("Y-m-d G:i",$der_upd);
		 
?>
<br>
<table width="60%" border="0" align="center">
<tr>
<td>
<fieldset>
<legend>Documents officiels de la société</legend>
<table width="100%"  border="0" cellspacing="0" cellpadding="0">
  <tr>
    <td width="38%"><div align="center">Nom</div></td>
    <td width="42%"><div align="center">Derni&egrave;re update </div></td>
    <td width="20%"><div align="center">Taille</div></td>
  </tr>
  <tr>
    <td colspan="3">&nbsp;</td>
  </tr>
  <tr>
    <td><?php
	if ($var_url != "") { // Retour au precedent
	echo '<img src="./images/design/retour.gif" border="0" />&nbsp;<a href="javascript:history.go(-1)">Retour</a>';
	echo "<br>";
	} else {
	}
	?></td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
  <tr>

<?php

?>
  <!-- ZONE A REPETER !-->
    <td>
	<?php
	for ($i=0;$i<count($array_dir);$i++)
	{
	
	if ($array_dir[$i] != "." && $array_dir[$i] != "..") {
	echo '<img src="./images/design/dossier.gif" border="0" />&nbsp;<a href="?dir=' . $dir . $array_dir[$i] . '/">' . $array_dir[$i] .'</a><br>';
		
		}
		}
		
	for ($i=0;$i<count($array_files);$i++)
	{
	echo '<img src="./images/design/fichier.gif" border="0" />&nbsp;<a href="' . $dir . $array_files[$i] . '">' . $array_files[$i] . '</a><br>' ;
	}
	?>
	</td>
	
	
    <td><?php 
									if ($ako == "0.00") {
										echo "";
									} elseif ($ako < 1024) {
										echo $ako . " Ko";
									} elseif ($ako > 1024) {
										echo $amo . " Mo";
									} else {
									}
?></td>
	
	
	
    <td>&nbsp;</td>


<?php
//}
closedir ($open);
?>
  </tr>
<tr>
    <td colspan="3">
	<hr>
	<form>
	<form name="form" method="post" action="" enctype="multipart/form-data">
	<input name="fichier" type="file" size="28" />
	<input type="submit" name="Submit" value="Envoyer">
	</form>
	</td>
	</tr>
</table>
</fieldset><br></td></tr></table>
alors je sais pas si je peux rajouter c'est 2 fonctions dans le for ou si il faut refaire une boucle, je trouve le for tres sympatique mais c'est un peu la galère pour l'integrer dans un tableau

merci

Eléphant du PHP | 291 Messages

12 nov. 2005, 17:01

en fait je raconte n'importe quoi, si je mettais les informations la ou il faut ca serait surement mieux

voila le code :
<?php
// Insertion du fichier admin/conf/conf.php
include ("conf/conf.php");
require ("conf/fonction.php");

// Récuperation de dir dans URL
$var_url = $_GET['dir'];

// Condition pour $dir
if ($var_url != "") {
$dir = $var_url;
} else {
$dir = "./data/societe/";
}

		$array_dir = array();
        $array_files = array();
        $open = opendir($dir);
        while($read = readdir($open))
        {
            $file = $dir . '/' .$read;
            $file = is_dir($file) ? array_push($array_dir,$read) : array_push($array_files,$read);
			
			// Découpe le nom de fichier en fonction du . si present
			$fichier = explode(".", $read);
			
			// Conversion de Octet en Ko et Mo
					$octet = filesize($dir . $read);
					$ko = $octet/1024;
					$mo = $ko/1024;
					$ako = sprintf ("%0.2f","$ko");
					$amo = sprintf ("%0.2f","$mo");
					
			// Dernier update
					$der_upd = filemtime($dir . $read);
					
					$anneel=substr($der_upd, 0, 4);
					$moisl=substr($der_upd, 5, 2);
					$jourl=substr($der_upd, 8, 2);
					$heurel=substr($der_upd, 11, 2);
					$minutel=substr($der_upd, 14, 2);
					$secondel=substr($der_upd, 17, 2);
					
					$der_up = date("Y-m-d G:i",$der_upd);
					
		}
		
		sort($array_dir);
        sort($array_files);
		
		//print_r ($array_dir);
		//print_r ($array_files);
		
?>
<br>
<table width="60%" border="0" align="center">
<tr>
<td>
<fieldset>
<legend>Documents officiels de la société</legend>
<table width="100%"  border="0" cellspacing="0" cellpadding="0">
  <tr>
    <td width="38%"><div align="center">Nom</div></td>
    <td width="42%"><div align="center">Derni&egrave;re update </div></td>
    <td width="20%"><div align="center">Taille</div></td>
  </tr>
  <tr>
    <td colspan="3">&nbsp;</td>
  </tr>
  <tr>
    <td><?php
	if ($var_url != "") { // Retour au precedent
	echo '<img src="./images/design/retour.gif" border="0" />&nbsp;<a href="javascript:history.go(-1)">Retour</a>';
	echo "<br>";
	} else {
	}
	?></td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
  <tr>

<?php

?>
  <!-- ZONE A REPETER !-->
    <td>
	<?php
	for ($i=0;$i<count($array_dir);$i++)
	{
	if ($array_dir[$i] != "." && $array_dir[$i] != "..") {
	
	echo '<img src="./images/design/dossier.gif" border="0" />&nbsp;<a href="?dir=' . $dir . $array_dir[$i] . '/">' . $array_dir[$i] .'</a><br>';
		
		}
		}
		
	for ($i=0;$i<count($array_files);$i++)
	{
	echo '<img src="./images/design/fichier.gif" border="0" />&nbsp;<a href="' . $dir . $array_files[$i] . '">' . $array_files[$i] . '</a><br>' ;
	}
	?>
	</td>
	
	
    <td><?php 
									if ($ako == "0.00") {
										echo "";
									} elseif ($ako < 1024) {
										echo $ako . " Ko";
									} elseif ($ako > 1024) {
										echo $amo . " Mo";
									} else {
									}
?></td>
	
	
	
    <td>&nbsp;</td>


<?php
//}
closedir ($open);
?>
  </tr>
<tr>
    <td colspan="3">
	<hr>
	<form>
	<form name="form" method="post" action="" enctype="multipart/form-data">
	<input name="fichier" type="file" size="28" />
	<input type="submit" name="Submit" value="Envoyer">
	</form>
	</td>
	</tr>
</table>
</fieldset><br></td></tr></table>
Donc le fietime() et filesize() fonctionne par contre je galere pour faire ma boucle d'affichage.

Je vois pas comment mettre bien en forme mon table avec c'est 2 for

merci

Eléphant du PHP | 291 Messages

12 nov. 2005, 17:56

en fait mon probleme c'est que en l'etat, le for se repete autant de fois qu'il y'a de fichier/dossier

Est il possible de lui dire de ne pas se repeter dans le while ?

D'avance merci

Eléphant du PHP | 291 Messages

13 nov. 2005, 13:03

Bonjour,

Est-ce qu'un break pourrait faire en sorte que les for ne s'executent qu'une seulle fois ?

D'avance merci

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

13 nov. 2005, 15:00

Salut, j'ai pas tout suivis mais tout ce que tu veut c'est d'exécuter qu'une seule fois la boucle for() comrise dans la boucle while() ?!

tu n'a qu'a initialiiser une variable a 0 avant le while qui dans cette meme boucle prend 1 et le for sera inclus dans un test et ne sera exécuté que si cette variable est a 0:
$var=0;
while(......)
{
    if($var==0)
    {
       for(...)
       {
          ....
       }
    }
    $var=1;
}

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

ViPHP
fab
ViPHP | 2657 Messages

13 nov. 2005, 15:02

soit je deviens taré soit je vois pas de for dans le while
Seul l'intelligent a le pouvoir de se trouver con
try { work(); } catch(FlemmeExeption $e) { sleep(84600); }

Eléphant du PHP | 291 Messages

13 nov. 2005, 16:16

Effectivement Fab dans le code que j'ai collé l'acollade qui ferme le while est mise en commentaire

Je vais essayé ca ce soir Truc je repasserais pour dire si je m'en suis sorti

Merci a vous

Eléphant du PHP | 291 Messages

13 nov. 2005, 17:09

bon ben j'ai pas pu attendre, donc j'ai testé ce que tu m'avais dit Truc, mais les 2 for ne semble plus s'executer en fait, il n'affiche plus rien du tout, par contre le reste s'affiche

voia le code :
<?php
		$array_dir = array();
        $array_files = array();
		$open = opendir($dir);
        
		
		
		
		
		$var=0;		
		while($read = readdir($open))
        {
            $file = $dir . '/' .$read;
            $file = is_dir($file) ? array_push($array_dir,$read) : array_push($array_files,$read);
			
			// Conversion de Octet en Ko et Mo
					$octet = filesize($dir . $read);
					$ko = $octet/1024;
					$mo = $ko/1024;
					$ako = sprintf ("%0.2f","$ko");
					$amo = sprintf ("%0.2f","$mo");
					
			// Dernier update
					$der_upd = filemtime($dir . $read);
					
					$anneel = substr($der_upd, 0, 4);
					$moisl = substr($der_upd, 5, 2);
					$jourl = substr($der_upd, 8, 2);
					$heurel = substr($der_upd, 11, 2);
					$minutel = substr($der_upd, 14, 2);
					$secondel = substr($der_upd, 17, 2);
					
					$der_up = date("Y-m-d G:i",$der_upd);
					
		//}
		
		sort($array_dir);
        sort($array_files);
		
		
		//print_r ($array_dir);
		//print_r ($array_files);
		
?>
<tr>
  <!-- ZONE A REPETER !-->
  <td><?php
  if ($read != "." && $read != "..") {
  echo ICOext($read); 
  }
  
  ?></td>
  
    <td>
	<?php
		if($var==0)
    {
		for ($i=0;$i<count($array_dir);$i++)
	{
			if ($array_dir[$i] != "." && $array_dir[$i] != "..") {
	
	echo '<a href="accueil.php?page=document_societe&dir=' . $dir . $array_dir[$i] . '/">' . $array_dir[$i] .'</a><br>';
		}
		}

	for ($i2=0;$i2<count($array_files);$i2++)
	{
	echo '<a href="' . $dir . $array_files[$i2] . '">' . $array_files[$i2] . '</a><br>' ;
	}
	    }
	?>
	</td>
    <td>
	<?php
	if ($read != "." && $read != "..") {
	echo dateFR($der_up) ;
	}
	?>
	</td>
    <td>
	<?php 
	if ($ako == "0.00") {
	echo "";
	} elseif ($ako < 1024) {
	echo $ako . " Ko";
	} elseif ($ako > 1024) {
	echo $amo . " Mo";
	} else {
	}
	?>
	</td>
<?php
$var=1;
}
closedir ($open);
?>
J'ai pas tout collé mais le principal est la

Merci de votre aide

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

13 nov. 2005, 18:06

bon voila, normal qu'il n'y ai pas grand chose qui s'affiche .. en effectuant les calcul de taille etc.. dans le while tu écrase toujours les données et tu ne gardes que le dernier fichier.

IL faut donc que tu construit les tableaux de dossiers et fichiers grace au while et ensuite en dehors du while() les boucles for().

Dans la 2eme boucle (celle de fichiers) tu effectu les calculs:
for ($i2=0;$i2<count($array_files);$i2++)
{
   $octet = filesize($dir . $array_files[$i2]);
   .. 
   $der_upd = filemtime($dir .$array_files[$i2]);
   ....
}
pour prendre en compte chaque fichier

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 291 Messages

15 nov. 2005, 21:24

Bonsoir,

Encor une fois merci Truc, ca fonctionne bien comme ca :
		$array_dir = array();
        $array_files = array();
		$open = opendir($dir);
		while($read = readdir($open))
        {
            $file = $dir . '/' .$read;
            $file = is_dir($file) ? array_push($array_dir,$read) : array_push($array_files,$read);
		
		}
		
		sort($array_dir);
        sort($array_files);

// Debut de l'affichage du tableau
echo '<table width="100%" border="0" cellspacing="1">';

		for ($i=0;$i<count($array_dir);$i++)
	{
			if ($array_dir[$i] != "." && $array_dir[$i] != "..") {

	echo '<tr><td>';
	echo '<img src="./images/design/icones/dossier.gif" border="0" width="16" height="16" />&nbsp;' ;
	echo '</td><td>';
	echo '<a href="accueil.php?page=document_societe&dir=' . $dir . $array_dir[$i] . '/">' . $array_dir[$i] .'</a><BR />';
	echo '</td>';
	
		}
		}
		
	echo '</tr>';

	for ($i2=0;$i2<count($array_files);$i2++)
	{
	echo '<tr><td>';
		echo ICOext($array_files[$i2]);
		echo '</td><td>';
		echo '<a href="' . $dir . $array_files[$i2] . '">' . $array_files[$i2] . '</a>';
		echo '<td>';

// Conversion de Octet en Ko et Mo
					$octet = filesize($dir . $array_files[$i2]);
					$ko = $octet/1024;
					$mo = $ko/1024;
					$ako = sprintf ("%0.2f","$ko");
					$amo = sprintf ("%0.2f","$mo");

	if ($ako == "0.00") {
	echo "";
	} elseif ($ako < 1024) {
	echo  '<td>&nbsp;' . $ako . ' Ko</td>';
	} elseif ($ako > 1024) {
	echo  '<td>&nbsp;' . $amo . ' Mo</td>';
	} else {
	}

// Dernier update
					$der_upd = filemtime($dir .$array_files[$i2]);
					
					$anneel = substr($der_upd, 0, 4);
					$moisl = substr($der_upd, 5, 2);
					$jourl = substr($der_upd, 8, 2);
					$heurel = substr($der_upd, 11, 2);
					$minutel = substr($der_upd, 14, 2);
					$secondel = substr($der_upd, 17, 2);
					
					$der_up = date("Y-m-d G:i",$der_upd);
					
echo  '<td>' . dateFR($der_up) . '<BR /></td>';
	
	}

closedir ($open);
 echo '</tr></table>';