php - por - Excluir archivos ocultos de scandir
scandir php (9)
Estoy usando el siguiente código para obtener una lista de imágenes en un directorio:
$files = scandir($imagepath);
pero $files
también incluye archivos ocultos. ¿Cómo puedo excluirlos?
En Unix, puede usar preg_grep
para filtrar los nombres de archivo que comienzan con un punto:
$files = preg_grep(''/^([^.])/'', scandir($imagepath));
Encontré un comentario de php.net, específicamente para sistemas Windows: http://php.net/manual/en/function.filetype.php#87161
Citando aquí para propósitos de archivo:
Uso la versión CLI de PHP en Windows Vista. A continuación se detalla cómo determinar si un archivo está marcado como "oculto" por NTFS:
function is_hidden_file($fn) { $attr = trim(exec(''FOR %A IN ("''.$fn.''") DO @ECHO %~aA'')); if($attr[3] === ''h'') return true; return false; }
Cambiar
if($attr[3] === ''h'')
aif($attr[4] === ''s'')
buscará los archivos del sistema.Esto debería funcionar en cualquier sistema operativo Windows que proporcione comandos de shell de DOS.
Reconozco porque estás tratando de ''filtrar'' los archivos ocultos, tiene más sentido y se ve mejor para hacer esto ...
$items = array_filter(scandir($directory), function ($item) {
return 0 !== strpos($item, ''.'');
});
Tampoco llamo a la variable $files
ya que implica que solo contiene archivos, pero de hecho también se pueden obtener directorios ... en algunos casos :)
Suponiendo que los archivos ocultos comienzan con a .
puedes hacer algo como esto cuando salgas:
foreach($files as $file) {
if(strpos($file, ''.'') !== (int) 0) {
echo $file;
}
}
Ahora revisa cada artículo si no hay ninguno .
como el primer personaje, y si no te hace sentir como lo harías.
Tiendo a utilizar DirectoryIterator para cosas como esta, que proporciona un método simple para ignorar los archivos de puntos:
$path = ''/your/path'';
foreach (new DirectoryIterator($path) as $fileInfo) {
if($fileInfo->isDot()) continue;
$file = $path.$fileInfo->getFilename();
}
Todavía estoy dejando la marca de verificación para la solución de seengee y habría publicado un comentario a continuación para una ligera corrección de su solución.
Su solución enmascara los directorios (. Y ..) pero no enmascara archivos ocultos como .htaccess
Un pequeño tweak resuelve el problema:
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>";
}
Use el siguiente código si también desea restablecer el índice de la matriz y establecer el orden:
$path = "the/path";
$files = array_values(
preg_grep(
''/^([^.])/'',
scandir($path, SCANDIR_SORT_ASCENDING)
));
Una línea:
$path = "daten/kundenimporte/";
$files = array_values(preg_grep(''/^([^.])/'', scandir($path, SCANDIR_SORT_ASCENDING)));
use preg_grep para excluir nombres de archivos con caracteres especiales, por ejemplo
$dir = "images/";
$files = preg_grep(''/^([^.])/'', scandir($dir));
function nothidden($path) {
$files = scandir($path);
foreach($files as $file) {
if ($file[0] != ''.'') $nothidden[] = $file;
return $nothidden;
}
}
Simplemente usa esta función
$files = nothidden($imagepath);