Исключить скрытые файлы из скандинава

Я использую следующий код, чтобы получить список изображений в каталоге:

$files = scandir($imagepath); 

но $files также содержит скрытые файлы. Как я могу их исключить?

Solutions Collecting From Web of "Исключить скрытые файлы из скандинава"

В Unix вы можете использовать preg_grep для фильтрации имен файлов, которые начинаются с точки:

 $files = preg_grep('/^([^.])/', scandir($imagepath)); 

Я обычно использую DirectoryIterator для таких вещей, который предоставляет простой метод для игнорирования точечных файлов:

 $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; } } 

Просто используйте эту функцию

 $files = nothidden($imagepath); 

Я считаю, что вы пытаетесь «отфильтровать» скрытые файлы, это имеет больше смысла и выглядит лучше всего для этого …

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

Я бы также не вызывал переменные $files так как подразумевал, что он содержит только файлы, но вы действительно можете получить каталоги … в некоторых случаях 🙂

используйте preg_grep для исключения имени файла со специальными символами, например

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

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

Предполагая, что скрытые файлы начинаются с . вы можете сделать что-то подобное при выводе:

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

Теперь вы проверяете каждый элемент, если его нет . как первый персонаж, и если это не эхо, как вам нравится.

Я встретил комментарий от php.net, особенно для систем Windows: http://php.net/manual/en/function.filetype.php#87161

Цитирование здесь для целей архивации:

Я использую версию CLI для PHP в Windows Vista. Вот как определить, помечен ли файл NTFS файлом:

 function is_hidden_file($fn) { $attr = trim(exec('FOR %A IN ("'.$fn.'") DO @ECHO %~aA')); if($attr[3] === 'h') return true; return false; } 

Изменение if($attr[3] === 'h') на if($attr[4] === 's') будет проверять системные файлы.

Это должно работать на любой ОС Windows, которая предоставляет команды оболочки DOS.

Я все еще оставляю галочку для решения для визитной карточки, и я бы разместил комментарий ниже для небольшой коррекции его решения.

Его решение маскирует каталоги (и ..), но не маскирует скрытые файлы, такие как .htaccess

Небольшая настройка решает проблему:

 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>"; }