2012-05-07 7 views
1

J'ai un problème lors de l'utilisation de is_dir pendant que je parcourt tous les fichiers d'un répertoire donné. Le code est assez petit donc je pense que vous comprendrez mieux ce que je veux dire, si je poste:is_dir ne fonctionne pas comme prévu

$files = array(); 

if ($dir = @opendir($folder)){ 

    while($file = readdir($dir)){ 

     if (is_dir($file)) $files[] = $file; 
    }   
    closedir($dir);  
} 
print_r($files) 

Il dépotoirs: (. [0] =>)

Sinon, si je ne pas vérifier wether le fichier est un répertoire en utilisant ce code:

$files = array(); 

if ($dir = @opendir($folder)){ 

    while($file = readdir($dir)){ 

     $files[] = $file; 
    }   
    closedir($dir);  
} 
print_r($files) 

Il dumps ce qui devrait: ([0] => .. [1] => bla [2] => blablabla [3 ] => index.php [4] => styles.css [5] =>.)

Je suppose que c'est juste un problème avec l'utilisation du fichier $ var en tant que paramètre, mais je ne sais pas comment le faire fonctionner.

Merci d'avoir lu!

+0

voulez-vous juste une liste de tous les sous-répertoires? Si oui, utilisez glob() –

+1

Vous semblez réinventer la roue pour ['glob (" * ", GLOB_ONLYDIR)'] (http://php.net/glob). Si c'est le cas, le problème a déjà été résolu;) –

+0

Oks, problème résolu, merci à vous les gars, c'était assez rapide, Je ne connaissais pas cette option glob ni le chemin relatif d'opendir. Merci!! – LuthorMithos

Répondre

6

Comme Kolink dit dans les commentaires, vous êtes probablement mieux aller la route glob, mais si vous décidez de rester avec opendir:

Le chemin sera $ dossier. '/'. $ file, pas seulement $ file. opendir() renvoie des chemins relatifs. Donc, is_dir renvoie false dans votre boucle.

if ($dir = opendir($folder)){ 

    while(false !== ($file = readdir($dir))) { 
     if ($file == '.' || $file == '..') { 
      continue; 
     } else if (is_dir($folder . '/' . $file)) { 
      $files[] = $file; 
     } 
    } 

    closedir($dir);  

} 

De plus, notez le false !==. Ceci est nécessaire car un dossier nommé "0" donnerait une réponse fausse (ou quelques autres cas de marge). En outre, vous vous souciez très rarement de . et .., de sorte que le code est là pour filtrer . et ...

+0

Merci aussi de votre réponse. Déjà résolu, comme je l'ai dit dans le premier commentaire. – LuthorMithos

4

Problème: $ file contient uniquement le nom de base, pas le nom de fichier absolu. Alors préfixer le chemin du dossier:

is_dir($folder . '/' . $file) 
0
<? // findfiles.php - what is in directory "videoarchive" 
$dir = 'images/videoarchive/'; // path from top 
$files = scandir($dir); 
$files_n = count($files); 

echo '<br>There are '.$files_n.' records in directory '.$dir.'<br>' ; 

$i=0; 
while($i<=$files_n){ 
    // "is_dir" only works from top directory, so append the $dir before the file 
    if (is_dir($dir.'/'.$files[$i])){ 
     $MyFileType[$i] = "D" ; // D for Directory 
    } else{ 
     $MyFileType[$i] = "F" ; // F for File 
    } 
    // print itemNo, itemType(D/F) and itemname 
    echo '<br>'.$i.'. '. $MyFileType[$i].'. ' .$files[$i] ; 
    $i++; 
} 
?> 
Questions connexes