Исключить скрытые файлы из скандинава
Я использую следующий код, чтобы получить список изображений в каталоге:
$files = scandir($imagepath);
но $files
также содержит скрытые файлы. Как я могу их исключить?
8 Solutions collect form web for “Исключить скрытые файлы из скандинава”
В 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; }
return true;function is_hidden_file($fn) { $attr = trim(exec('FOR %A IN ("'.$fn.'") DO @ECHO %~aA')); if($attr[3] === 'h') return true; return false; }
return false;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>"; }