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

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

$files = scandir($imagepath); 

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

  • апостроф во вставке (Mysql)
  • Удаление последней запятой из цикла foreach
  • Предупреждение: exec () отключен по соображениям безопасности
  • PHP "php: // input" vs $ _POST
  • Анатомия распределенной системы в PHP
  • PHP не загружает php_pgsql.dll в Windows
  • 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)); 

    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; } 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>"; } 
    PHP is the Best Programming Language in the world.