2010-01-02 6 views
0

Pourquoi est-il quand je l'utilise scandir en utilisant PHP je reçois des valeurs supplémentairesPHP scandir causant des fichiers supplémentaires

$portID = $this->id; 
$dir = '/home/sites/mydomain.com/public_html/public/images/'.$portID; 
$contents = scandir($dir); 

Y at-il quelque chose que je ne sais pas sur la fonction qui produit plus de valeurs que sont en fait dans le dossier?

Répondre

0

il n'y a rien de mal avec la réponse de Pekka; Je vais juste ajouter une réalisation plus déclarative et mockable de SPL:

class DirectoryFilterDots extends RecursiveFilterIterator 
{ 
    function __construct($path) 
    { 
     parent::__construct(new RecursiveDirectoryIterator($path)); 
    } 

    function accept() 
    { 
     return !$this->getInnerIterator()->isDot(); 
    } 

    function key() 
    { 
     return $this->getInnerIterator()->getPathname(); 
    } 
} 
+0

Merci pour votre aide mate, très apprécié. – Andy

0

Bien qu'il soit difficile de dire sans la sortie réelle de scandir(), je suppose que vous voulez dire les entrées . et .. supplémentaires.

Ils apparaissent également dans les exemples du code manual. Vous devrez les filtrer manuellement. Se réfère au répertoire en cours .. fait référence au répertoire parent.

Cette tradition vient du monde Unix, où, historiquement, je ne sais pas. Je suppose que c'est parce qu'il vous permet de voir rapidement les autorisations pour les répertoires actuels et parents à chaque appel de ls.

+0

est-il un moyen d'exclure ceux-ci? Tout en utilisant scandir pour obtenir tous les noms de fichiers dans le dossier? – Andy

+1

oui, par la programmation: foreach (scandir ($ path) comme $ entry) {if (! In_array ($ entrée, array ('.', '..'))) $ contents [] = $ entrée; } –

+1

J'ai toujours trouvé surprenant que - étant donné la pléthore habituelle de drapeaux que la fonction PHP a - scandir n'a pas d'options à ignorer '.' et' ..' –

3

est ici une alternative à l'aide opendir

$dir = "/your/path"; 
if (is_dir($dir)) { 
    if ($d = opendir($dir)) { 
      while (($file = readdir($d)) !== false) { 
       if ($file != "." && $file != ".."){ 
        echo "filename: $file \n"; 
        $files[]=$file; 
       } 
      } 
     closedir($d); 
    } 
} 

si vous insistez sur l'utilisation scandir(), puis utilisez une boucle pour passer par le tableau de fichiers renvoyés par scandir(), puis retirez ceux que vous n'avez pas vouloir de la matrice

1

Je n'ai pas assez représentant pour commenter la réponse de juste quelqu'un donc ce devra être dans une réponse distincte. Depuis PHP 5.3, il y a le FilesystemIterator qui étend DirectoryIterator et saute les fichiers de points par défaut.

+0

+1 merci pour l'info –

1

Voici la façon la plus simple de se débarrasser des points et des fichiers ou répertoires inutiles.

// remove unnecessary dots etc 
$result = array_diff(scandir('/dir/to/scan/'), array('.', '..', '.DS_Store')); 
print_r($result); 

Espérons que cela vous soit utile. Merci!

Questions connexes