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?
9 réponses
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();
}
function nothidden($path) {
$files = scandir($path);
foreach($files as $file) {
if ($file[0] != '.') $nothidden[] = $file;
return $nothidden;
}
}
utilisez simplement cette fonction
$files = nothidden($imagepath);
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 :)
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));
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.
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.
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)));
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>";
}