web-dev-qa-db-fra.com

Exclure les fichiers cachés de scandir

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

$files = scandir($imagepath);

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

32
Sino

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

$files = preg_grep('/^([^.])/', scandir($imagepath));
61
mario
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
Henrik Albrechtsson

J'ai tendance à utiliser DirectoryIterator pour des choses comme celle-ci, 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
robjmills

Je pense que parce que vous essayez de "filtrer" les fichiers cachés, cela a plus de sens 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 car elle implique qu’elle ne contient que des fichiers, mais vous pouvez également obtenir des répertoires ... dans certains cas :)

1
TiMacDonald

utilisez preg_grep pour exclure le nom de fichier avec des caractères spéciaux, par exemple.

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

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

1
Vrushal Raut

En supposant que les fichiers cachés commencent par un ., vous pouvez procéder de la manière suivante:

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

Maintenant, vous vérifiez pour chaque élément s'il n'y a pas de . en tant que premier caractère, sinon, il vous renvoie comme vous le feriez.

0
stefandoorn

Utilisez le code suivant si vous souhaitez également réinitialiser l'index de tableau et définir l'ordre:

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

Une ligne:

$path = "daten/kundenimporte/";
$files = array_values(preg_grep('/^([^.])/', scandir($path, SCANDIR_SORT_ASCENDING)));
0
Black

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

Citant ici à des fins d'archivage:

J'utilise la version CLI de PHP sur Windows Vista. Voici comment déterminer si un fichier est marqué "caché" 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') en if($attr[4] === 's') vérifiera les fichiers système.

Cela devrait fonctionner sur tout système d'exploitation Windows fournissant des commandes DOS Shell.

0
Oytun