Исключить скрытые файлы из scandir
Я использую следующий код, чтобы получить список изображений в каталоге:
$files = scandir($imagepath);
но $files
также включает скрытые файлы. Как я могу их исключить?
9 ответов
в 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));
предполагая, что скрытые файлы начинаются с .
вы можете сделать что-то подобное при выводе:
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')
toif($attr[4] === 's')
проверит системные файлы.Это должно работать на любой ОС Windows, что предоставляет команды оболочки DOS.
используйте следующий код, если вы хотите сбросить индекс массива и установить порядок:
$path = "the/path";
$files = array_values(
preg_grep(
'/^([^.])/',
scandir($path, SCANDIR_SORT_ASCENDING)
));
одна строка:
$path = "daten/kundenimporte/";
$files = array_values(preg_grep('/^([^.])/', scandir($path, SCANDIR_SORT_ASCENDING)));
Я все еще оставляю галочку для решения seengee, и я бы опубликовал комментарий ниже для небольшой коррекции его решения.
его решение, маски справочников(. и..), но не маскирует скрытые файлы как .реврайт
небольшая настройка решает проблему:
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>";
}