Исключить скрытые файлы из scandir - PullRequest
33 голосов
/ 16 декабря 2011

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

$files = scandir($imagepath);

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

Ответы [ 10 ]

65 голосов
/ 16 декабря 2011

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

$files = preg_grep('/^([^.])/', scandir($imagepath));
5 голосов
/ 16 декабря 2011

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

$path = '/your/path';
foreach (new DirectoryIterator($path) as $fileInfo) {
    if($fileInfo->isDot()) continue;
    $file =  $path.$fileInfo->getFilename();
}
4 голосов
/ 04 февраля 2015
function nothidden($path) {
    $files = scandir($path);
    foreach($files as $file) {
        if ($file[0] != '.') $nothidden[] = $file;
        return $nothidden;
    }
}

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

$files = nothidden($imagepath);
1 голос
/ 10 октября 2018
$files = array_diff(scandir($imagepath), array('..', '.'));

или

$files = array_slice(scandir($imagepath), 2);

может быть быстрее, чем

$files = preg_grep('/^([^.])/', scandir($imagepath));
1 голос
/ 06 мая 2017

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

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

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

1 голос
/ 02 января 2017

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

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

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

1 голос
/ 23 февраля 2015

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

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

Я использую версию PHP CLI для WindowsVista.Вот как определить, помечен ли файл 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.

0 голосов
/ 18 апреля 2018

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

$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)));
0 голосов
/ 04 июля 2012

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

Его решение маскирует каталоги (. И ..), но не маскирует скрытые файлы, такие как .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>";
}
0 голосов
/ 16 декабря 2011

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

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

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

...