Exclure les fichiers cachés de scandir

j'utilise le code suivant pour obtenir une liste des images dans un répertoire:

$files = scandir($imagepath);

mais $files inclut aussi les fichiers cachés. Comment puis-je exclure?

31
demandé sur Mark Amery 2011-12-16 14:04:31

9 réponses

sous Unix, vous pouvez utiliser preg_grep pour filtrer les noms de fichiers commençant par un point:

$files = preg_grep('/^([^.])/', scandir($imagepath));
59
répondu mario 2015-05-30 12:20:20

J'ai tendance à utiliser DirectoryIterator pour des choses comme ceci qui fournit une méthode simple pour ignorer les fichiers de points:

$path = '/your/path';
foreach (new DirectoryIterator($path) as $fileInfo) {
    if($fileInfo->isDot()) continue;
    $file =  $path.$fileInfo->getFilename();
}
4
répondu robjmills 2011-12-16 10:08:56
function nothidden($path) {
    $files = scandir($path);
    foreach($files as $file) {
        if ($file[0] != '.') $nothidden[] = $file;
        return $nothidden;
    }
}

utilisez simplement cette fonction

$files = nothidden($imagepath);
4
répondu Henrik Albrechtsson 2015-02-04 19:18:09

je pense que parce que vous essayez de "filtrer" les fichiers cachés, il est plus logique et semble préférable de le faire...

$items = array_filter(scandir($directory), function ($item) {
    return 0 !== strpos($item, '.');
});

Je n'appellerais pas non plus la variable $files parce qu'il implique qu'il ne contient que des fichiers, mais vous pouvez en effet obtenir des répertoires ainsi...dans certains cas :)

1
répondu TiMacDonald 2017-01-02 03:19:07

Utilisez preg_grep pour exclure les noms de fichiers avec des caractères spéciaux pour par exemple

$dir = "images/";
$files = preg_grep('/^([^.])/', scandir($dir));

http://php.net/manual/en/function.preg-grep.php

1
répondu Vrushal Raut 2017-05-06 18:38:23

en supposant que les fichiers cachés commencent par un . vous pouvez faire quelque chose comme cela lors de la sortie:

foreach($files as $file) {
    if(strpos($file, '.') !== (int) 0) {
        echo $file;
    }
}

maintenant vous vérifiez chaque élément s'il n'y a pas de . comme premier personnage, et si ce n'est pas l'écho que vous voulez faire.

0
répondu stefandoorn 2011-12-16 10:08:19

j'ai rencontré un commentaire de php.net spécifiquement pour les systèmes Windows: http://php.net/manual/en/function.filetype.php#87161

cite ici à des fins d'archivage:

j'utilise la version CLI de PHP sur Windows Vista. Voici comment déterminer si un fichier est marqué "hidden" par NTFS:

function is_hidden_file($fn) {

    $attr = trim(exec('FOR %A IN ("'.$fn.'") DO @ECHO %~aA'));

    if($attr[3] === 'h')
        return true;

    return false;
}

Changer if($attr[3] === 'h')if($attr[4] === 's') vérifie les fichiers système.

cela devrait fonctionner sur tout système D'exploitation Windows qui fournit des commandes de shell DOS.

0
répondu Oytun Tez 2015-02-23 19:04:40

utilisez le code suivant si vous souhaitez réinitialiser l'index du tableau et définir l'ordre:

$path = "the/path";
$files = array_values(
    preg_grep(
        '/^([^.])/', 
        scandir($path, SCANDIR_SORT_ASCENDING)
));

Une seule ligne:

$path = "daten/kundenimporte/";
$files = array_values(preg_grep('/^([^.])/', scandir($path, SCANDIR_SORT_ASCENDING)));
0
répondu Black 2018-04-18 09:53:03

je suis toujours en train de laisser le crochet pour la solution de seengee et j'aurais posté un commentaire ci-dessous pour une légère correction à sa solution.

sa solution masque les répertoires(. et. .), mais ne masque pas les fichiers cachés comme .htaccess

Un mineur tweak permet de résoudre le problème:

foreach(new DirectoryIterator($curDir) as $fileInfo) {
    //Check for something like .htaccess in addition to . and ..
    $fileName = $fileInfo->getFileName();
    if(strlen(strstr($fileName, '.', true)) < 1) continue;

     echo "<h3>" . $fileName . "</h3>";
}
-1
répondu calmcajun 2012-07-04 16:10:00