Определить, какое из заданных имен файлов соответствует маске mas p

Обновлено: 04.07.2024

Имена файлов Windows состоят из двух частей. имя файла, затем точка, за которой следует расширение (суффикс). Расширение представляет собой трех- или четырехбуквенную аббревиатуру, обозначающую тип файла. Например, в файле letter.docx имя файла — буква, а расширение — docx. Расширения важны, потому что они сообщают вашему компьютеру, какой значок использовать для файла и какое приложение может открыть файл. Например, расширение doc сообщает вашему компьютеру, что файл является файлом Microsoft Word.

Если вы хотите открыть файл MAC OS X в Windows, вам может потребоваться добавить расширение к имени файла MAC OS X, чтобы Windows могла его распознать. Например, если у вас есть документ Word 6 MAC OS X с именем letter, который вы хотите открыть в Windows, вам нужно переименовать файл letter.docx, чтобы Word в Windows распознал и открыл этот файл.

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

Примечание. Если ни у одного из ваших имен файлов нет расширений, расширения файлов будут скрыты. См. Отображение расширений файлов

Отображение расширений файлов

Если ни одно из ваших имен файлов не имеет расширений, расширения файлов скрыты. Чтобы показать расширения файлов:

<р>1. В Проводнике откройте вкладку "Вид" и установите флажок рядом с "Расширения имен файлов".


<р>1. Нажмите на меню "Пуск" и введите "Показать скрытые файлы и папки", затем нажмите клавишу ввода или выберите этот параметр в списке результатов.



Поиск расширений файлов

Иногда может потребоваться выполнить поиск всех файлов определенного типа. Например, вы можете найти файл .pst или файл .mp3 на своем компьютере. Выполните следующие действия, чтобы найти расширение файла.


<р>1. Щелкните меню «Пуск» или строку поиска и введите «*», а затем расширение файла, который вы хотите найти (например, *.jpg), и нажмите клавишу «Ввод».

Некоторая информация относится к предварительной версии продукта, которая может быть существенно изменена до ее выпуска. Microsoft не дает никаких явных или подразумеваемых гарантий в отношении представленной здесь информации.

Возвращает имена файлов, соответствующих заданным критериям.

Перегрузки

Возвращает имена файлов (включая их пути) в указанном каталоге.

Возвращает имена файлов (включая их пути), которые соответствуют указанному шаблону поиска в указанном каталоге.

Возвращает имена файлов (включая их пути), которые соответствуют указанному шаблону поиска и параметрам перечисления в указанном каталоге.

Возвращает имена файлов (включая их пути), которые соответствуют указанному шаблону поиска в указанном каталоге, используя значение для определения необходимости поиска в подкаталогах.

Получить файлы(строка)

Возвращает имена файлов (включая их пути) в указанном каталоге.

Параметры

Относительный или абсолютный путь к каталогу для поиска. В этой строке не учитывается регистр.

Возврат

Массив полных имен (включая пути) файлов в указанном каталоге или пустой массив, если файлы не найдены.

Исключения

путь — это имя файла.

Произошла ошибка сети.

У вызывающего абонента нет необходимого разрешения.

Указанный путь, имя файла или оба параметра превышают максимальную длину, определенную системой.

Указанный путь не найден или недействителен (например, он находится на несопоставленном диске).

Примеры

В следующем примере показано, как использовать метод GetFiles для возврата имен файлов из указанного пользователем местоположения. Пример настроен так, чтобы перехватывать все ошибки, характерные для этого метода.

Примечания

Методы EnumerateFiles и GetFiles различаются следующим образом: при использовании EnumerateFiles можно начать перечисление коллекции имен до того, как будет возвращена вся коллекция; когда вы используете GetFiles, вы должны дождаться возврата всего массива имен, прежде чем вы сможете получить доступ к массиву. Поэтому, когда вы работаете с большим количеством файлов и каталогов, EnumerateFiles может быть более эффективным.

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

Этот метод идентичен GetFiles(String, String) со звездочкой (*), указанной в качестве шаблона поиска.

Параметр пути может указывать относительный или абсолютный путь.Информация об относительном пути интерпретируется как относительная к текущему рабочему каталогу. Чтобы получить текущий рабочий каталог, см. GetCurrentDirectory.

Порядок возвращаемых имен файлов не гарантируется; используйте метод Sort, если требуется определенный порядок сортировки.

Параметр пути не чувствителен к регистру.

Список общих задач ввода-вывода см. в разделе Общие задачи ввода-вывода.

См. также

Относится к

Получить файлы(строка, строка)

Возвращает имена файлов (включая их пути), которые соответствуют указанному шаблону поиска в указанном каталоге.

Параметры

Относительный или абсолютный путь к каталогу для поиска. В этой строке не учитывается регистр.

Строка поиска для сопоставления с именами файлов в пути . Этот параметр может содержать комбинацию допустимого прямого пути и подстановочных знаков (* и ?), но не поддерживает регулярные выражения.

Возврат

Массив полных имен (включая пути) файлов в указанном каталоге, соответствующих заданному шаблону поиска, или пустой массив, если файлы не найдены.

Исключения

путь — это имя файла.

Произошла ошибка сети.

У вызывающего абонента нет необходимого разрешения.

searchPattern не содержит допустимого шаблона.

path или searchPattern имеет значение null .

Указанный путь, имя файла или оба параметра превышают максимальную длину, определенную системой.

Указанный путь не найден или недействителен (например, он находится на несопоставленном диске).

Примеры

В следующем примере подсчитывается количество файлов, начинающихся с указанной буквы.

Примечания

Возвращаемые имена файлов добавляются к указанному параметру пути, и порядок возвращаемых имен файлов не гарантируется; используйте метод Sort, если требуется определенный порядок сортировки.

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

Подстановочный знак Соответствия
* (звездочка) Ноль или более символов в этой позиции.
? (вопросительный знак) Ноль или один символ в этой позиции.

Символы, кроме подстановочных знаков, являются буквальными символами. Например, строка searchPattern "*t" ищет все имена в пути, оканчивающемся на букву "t". Строка searchPattern "s*" ищет все имена в пути, начинающемся с буквы "s".

SearchPattern не может заканчиваться двумя точками ("..") или содержать две точки (".."), за которыми следует DirectorySeparatorChar или AltDirectorySeparatorChar, а также не может содержать недопустимых символов. Вы можете запросить недопустимые символы с помощью метода GetInvalidPathChars.

При использовании подстановочного знака звездочки в шаблоне поиска, таком как "*.txt", количество символов в указанном расширении влияет на поиск следующим образом:

  • Если указанное расширение состоит ровно из трех символов, метод возвращает файлы с расширениями, начинающимися с указанного расширения. Например, "*.xls" возвращает как "book.xls", так и "book.xlsx".
  • Во всех остальных случаях метод возвращает файлы, точно соответствующие указанному расширению. Например, "*.ai" возвращает "file.ai", но не "file.aif".

При использовании подстановочного знака вопросительного знака этот метод возвращает только файлы, соответствующие указанному расширению файла. Например, для двух файлов, "file1.txt" и "file1.txtother", в каталоге, шаблон поиска "file?.txt" возвращает только первый файл, тогда как шаблон поиска "file*.txt" возвращает оба файла.

Поскольку этот метод проверяет имена файлов как в формате имени файла 8.3, так и в формате длинного имени файла, шаблон поиска, аналогичный "*1*.txt", может возвращать неожиданные имена файлов. Например, при использовании шаблона поиска "*1*.txt" возвращается "longfilename.txt", поскольку эквивалентным форматом имени файла версии 8.3 является "LONGFI~1.TXT".

Методы EnumerateFiles и GetFiles различаются следующим образом: при использовании EnumerateFiles можно начать перечисление коллекции имен до того, как будет возвращена вся коллекция; когда вы используете GetFiles, вы должны дождаться возврата всего массива имен, прежде чем вы сможете получить доступ к массиву. Поэтому, когда вы работаете с большим количеством файлов и каталогов, EnumerateFiles может быть более эффективным.

Параметр пути может указывать относительный или абсолютный путь. Информация об относительном пути интерпретируется как относительная к текущему рабочему каталогу. Чтобы получить текущий рабочий каталог, см. GetCurrentDirectory.

Маски файлов и подстановочные знаки поддерживаются в любых параметрах действий или триггеров, которые указывают имена папок или файлов, обычно это действия файловой системы, сжатия, шифрования и FTP.Маска файла, по сути, представляет собой набор фиксированных и подстановочных знаков, используемых для сопоставления имен папок и файлов. Они предоставляют гибкие средства для идентификации определенного файла или группы файлов на основе их имени и расширения. Подстановочный знак можно использовать для замены любого другого символа или символов в строке. Используя маски и подстановочные знаки, вы можете легко указать, какие файлы и/или папки следует обрабатывать, а какие следует игнорировать.

Маски файлов могут состоять из любой комбинации следующего:

Фиксированные символы — буквы, цифры и другие символы, разрешенные в именах файлов.

Вопросительный знак (?) – обозначает любой отдельный символ.

Звездочка (*) — обозначает любую последовательность символов (включая отсутствие символов).

Хотя четко определено, что маска файла, содержащая только фиксированные символы, однозначно идентифицирует файл (например, маска файла myFile.txt относится только к текстовому файлу с именем myFile.txt ), маска файла, содержащая символы подстановки? и/или * может относиться к одному или нескольким файлам.

Несколько файлов маски

В большинстве случаев можно указать несколько файлов или объединить несколько масок подстановочных знаков, разделив каждую вертикальной чертой (|). Например, следующая маска включает все изображения JPG и GIF, содержащиеся в c:\temp\:

Подстановочные знаки позволяют маске файла соответствовать нескольким именам папок или файлов. В таблице ниже приведены различные примеры масок файлов.

Соответствует всем файлам, содержащим любое количество символов, с расширениями или без них (например, ввод A* соответствует любому файлу или папке, начинающейся с буквы A, за которой следует любое количество символов).

Соответствует всем файлам, содержащим любое количество символов и с любым расширением. Соответствует даже файлам без расширения (например, ввод A*.* соответствует любому файлу, начинающемуся с буквы A, за которой следует любое количество символов вместе с любым расширением).

Соответствует любому одиночному символу (например, ввод A? соответствует любому файлу, начинающемуся с буквы A, за которой следует любой одиночный символ).

Соответствует всем файлам, имена которых содержат любое количество символов с расширением .jpg (например, image_name.jpg, cool_pic.jpg, 1.jpg).

Соответствует всем файлам, имена которых содержат любое количество символов с расширением, начинающимся с буквы p (например, document.pdf, image_name.jpg, business.project, 1.ppt )

Соответствует всем файлам, имена которых начинаются с pic (например, picture_name.jpg, pictogram.ico, picker.html, pic ).

Соответствует всем файлам .html с именами, начинающимися с любой последовательности символов, за которыми следует строка mat и заканчивающаяся одним символом (например,automate.html, mate.html, tomato.html).

Соответствует всем файлам с именами, содержащими шесть символов и без расширения (например, 123456, myFile, my_pic, images)

Соответствует всем файлам .pdf, имена которых начинаются с doc, за которым следуют любые пять символов (например, document.pdf, доктрина.pdf, doc_1234.pdf).

Соответствует определенным именам файлов или маскам подстановочных знаков, которые находятся в том же каталоге (например, c:\temp\file1.txt|file2.jpg|file3.jpg).

Соответствует определенным именам файлов или маскам с подстановочными знаками, которые находятся в разных каталогах (например, c:\photos\*.jpg|\c:\music\*.mp3).

(Если указатель и содержание скрыты, щелкните значок в левом верхнем углу.)

Мне нужно решить, соответствует ли имя файла маске файла. Маска файла может содержать * или ? персонажи. Есть ли какое-нибудь простое решение для этого?

13 ответов 13

Я ценю, что нашел ответ Джоэла, он также сэкономил мне время! Однако мне пришлось внести несколько изменений, чтобы метод работал так, как ожидало большинство пользователей:

  • Я удалил ключевое слово this перед первым аргументом. Здесь он ничего не делает (хотя может быть полезен, если метод предназначен для использования в качестве метода расширения, и в этом случае он должен быть общедоступным и содержаться в статическом классе, а сам должен быть статическим методом).
  • Я сделал регулярное выражение независимым от регистра, чтобы оно соответствовало стандартному поведению подстановочных знаков Windows (например, "c*.*" и "C*.*" возвращают один и тот же результат).
  • Я добавил начальную и конечную привязки к регулярному выражению, опять же, чтобы соответствовать стандартному поведению подстановочных знаков Windows (например, "stuff.txt" будет соответствовать "stuff*", "s*" или "s*.*", но а не просто "s").

Обновление 2009.11.04: соответствие одной из нескольких масок

Для еще большей гибкости здесь используется плагин-совместимый метод, созданный поверх оригинала. Эта версия позволяет передавать несколько масок (отсюда множественное число во втором имени параметра fileMasks), разделенных линиями, запятыми, вертикальными чертами или пробелами. Я хотел, чтобы пользователь мог поместить в ListBox столько вариантов, сколько пожелает, а затем выбрать все файлы, соответствующие любому из них. Обратите внимание, что некоторые элементы управления (например, ListBox) используют CR-LF для разрывов строк, в то время как другие (например, RichTextBox) используют только LF, поэтому и "\r\n", и "\n" отображаются в списке разделения.< /p>

2009.11.17 Обновление: более изящная обработка входных данных fileMask

Предыдущая версия FitsMask (которую я оставил для сравнения) неплохо справляется со своей задачей, но, поскольку мы рассматриваем ее как регулярное выражение, она выдает исключение, если при входе не является допустимым регулярным выражением. Решение состоит в том, что мы действительно хотим, чтобы любые метасимволы регулярных выражений во входном файлеMask считались литералами, а не метасимволами. Но нам все еще нужно специально обрабатывать точку, звездочку и вопросительный знак. Таким образом, эта улучшенная версия FitsMask безопасно убирает эти три символа, преобразует все оставшиеся метасимволы в литералы, а затем возвращает три интересных символа обратно в их "регулярно выраженную" форму.

Еще одно незначительное улучшение – возможность независимости от регистра в соответствии со стандартным поведением Windows.

Обновление 30.09.2010: где-то по пути возникла страсть.

Я небрежно не обновил это ранее, но эти ссылки, вероятно, будут интересны читателям, которые дошли до этого места:

Возвращает массив файлов и каталогов из каталога .

Параметры

Каталог, который будет просканирован.

По умолчанию сортировка осуществляется в алфавитном порядке по возрастанию. Если необязательный sorting_order установлен в SCANDIR_SORT_DESCENDING , то порядок сортировки будет алфавитным в порядке убывания. Если установлено значение SCANDIR_SORT_NONE, результат не сортируется.

Описание параметра контекста см. в разделе руководства о потоках.

Возвращаемые значения

Возвращает массив имен файлов в случае успеха или false в случае ошибки. Если каталог не является каталогом, то возвращается логическое значение false и генерируется ошибка уровня E_WARNING.

Журнал изменений

Версия Описание
8.0.0 контекст теперь можно обнулить.

Примеры

$dir = '/tmp' ;
$files1 = скандир ( $каталог );
$files2 = scandir ( $dir , 1 );

print_r ( $files1 );
print_r ( $files2 );
?>

Приведенный выше пример выведет что-то похожее на:

Примечания

URL-адрес можно использовать в качестве имени файла с этой функцией, если включена оболочка fopen. См. fopen() для более подробной информации о том, как указать имя файла. См. Поддерживаемые протоколы и оболочки для получения ссылок на информацию о возможностях различных оболочек, заметок об их использовании и информации о любых предопределенных переменных, которые они могут предоставлять.

См. также

  • opendir() — открыть дескриптор каталога
  • readdir() — чтение записи из дескриптора каталога
  • glob() – находит пути, соответствующие шаблону.
  • is_dir() — сообщает, является ли имя файла каталогом
  • sort() — сортировка массива по возрастанию

Пользовательские заметки 37 заметок

Простой способ избавиться от точек, которые scandir() обнаруживает в среде Linux:

$directory = '/path/to/my/directory' ;
$scanned_directory = array_diff ( scandir ( $directory ), array( '..' , '.' ));
?>

Вот мои 2 цента. Я хотел рекурсивно создать массив моей структуры каталогов. Я хотел легко получить доступ к данным в определенном каталоге, используя foreach. У меня получилось следующее:

Функция

dirToArray ( $dir )

$cdir = скандир ( $dir );
foreach ( $cdir as $key => $value )
<
if (! in_array ( $value ,array( "." , ".." )))
<
if ( is_dir ( $dir . DIRECTORY_SEPARATOR . $value ))
<
$result [ $value ] = dirToArray ( $dir . DIRECTORY_SEPARATOR . $value );
>
еще
<
$result [] = $value ;
>
>
>

вернуть $результат;
>
?>

Вывод
Массив
(
[subdir1] => Массив
(
[ 0] => file1.txt
[subsubdir] => Array
(
[0] => file2.txt
[1] => file3.txt
)
)
[subdir2] => Массив
(
[0] => file4.txt
>
)

Кто-то написал, что array_slice можно использовать для быстрого удаления записей каталога "." а также "..". Однако «-» — это допустимая запись, которая должна стоять перед ними, поэтому array_slice удалит неправильные записи.

Как я решил проблему с '.' и '..'

$x = scandir__DIR__; //любой каталог
foreach ($x as $key => $value) if ('.' !== $value && '..' !== $value) echo $value;
>
>
Просто и работает

Самый быстрый способ получить список файлов без точек.
$files = array_slice ( scandir ( '/path/to/directory/' ), 2 );

Для каталога, содержащего такие файлы, как (например) -.jpg, результаты scandir немного "странные" ;)

$dir = '/somedir' ;
$files = scandir ( $dir );
print_r ( $files );
?>

Массив
(
[0] => -.jpg
[1] => .
[2] = > ..
[3] => foo.txt
[4] => somedir
)

Осторожно, сортировка осуществляется в порядке ASCII :)

Мне нужно было найти способ получить полный путь ко всем файлам в каталоге и всех подкаталогах каталога.
Вот мое решение: рекурсивные функции!

функция find_all_files ( $dir )
<
$root = scandir ( $dir );
foreach( $root as $value )
<
if( $value === '.' || $value === '..' )
if( is_file ( "$dir / $value") < $result []= "$dir / $value" ;continue;>
foreach( find_all_files ("$dir / $value" ) as $value )
<
$result []= $value ;
>
>
возврат $result ;
>
?>

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

И я хотел разрешить перегрузку, потому что иногда мне лень передавать все параметры.
class scanDir static private $directories , $files , $ext_filter , $recursive ;

// ------------------------------------------------------------ -------------------------------------------------- < br />// scan(dirpath::string|array, extensions::string|array, recursive::true|false)
static public function scan() // Инициализировать значения по умолчанию
self :: $ рекурсивный = ложь;
self :: $directories = array();
self :: $files = array();
я :: $ext_filter = false ;

// Проверяем наличие минимальных параметров
if(! $args = func_get_args ()) die("Необходимо указать строку пути или массив строк пути" );
>
if( gettype ( $args [ 0 ]) != "string" && gettype ( $args [ 0 ]) != "array" ) die( "Должен предоставить строку пути или массив строки пути");
>

// Проверяем, рекурсивное сканирование | действие по умолчанию: нет подкаталогов
if(isset( $args [ 2 ]) && $args [ 2 ] == true )

// Был ли включен фильтр по расширениям файлов? | действие по умолчанию: вернуть все типы файлов
if(isset($args[1])) if(gettype($args[1]) == "array")< self :: $ext_filter = array_map('strtolower' , $args [1]);>
else
if( gettype ( $args [ 1 ]) == "string" )< self :: $ext_filter [] = strtolower ( $args [ 1 ] );>
>

// Захват пути(ов)
self :: verifyPaths ( $args [ 0 ]);
вернуть себя :: $files ;
>

статическая приватная функция verifyPaths ( $paths ) $path_errors = array();
if(gettype ( $paths ) == "строка")

foreach($paths as $path) if(is_dir($path)) self :: $directories[] = $path;
$dirContents = self :: find_contents ( $path );
> else $path_errors [] = $path ;
>
>

// Вот как мы сканируем каталоги
static private function find_contents ( $dir ) $result = array();
$root = scandir ( $dir );
foreach( $root as $value ) if( $value === '.' || $value === '..' )
if( is_file ( $dir . DIRECTORY_SEPARATOR . $value ) ) if(! self :: $ext_filter || in_array ( strtolower ( pathinfo ( $dir . DIRECTORY_SEPARATOR . $value , PATHINFO_EXTENSION )), self :: $ext_filter )) self :: $files [] = $result [] = $ реж. DIRECTORY_SEPARATOR . $значение;
>
продолжить;
>
if( self :: $recursive ) foreach( self :: find_contents ( $dir . DIRECTORY_SEPARATOR . $value ) as $value ) self :: $files [] = $result [] = $ стоимость ;
>
>
>
// Возврат требуется для рекурсивного поиска
return $result ;
>
>
?>

Использование:
scanDir::scan(path(s):string|массив, [file_extensions:string|массив ], [подпапки?:true|false]);
//Сканировать один каталог на наличие всех файлов, без подкаталогов
$files = scanDir :: scan ( 'D:\Websites\temp' );

//Сканировать несколько каталогов на наличие всех файлов, без подкаталогов
$dirs = array(
'D:\folder' ;
'D:\folder2' ;
'D:\folder2' ;
'C:\Другое' ;
);
$files = scanDir :: scan ( $dirs );

// Сканировать несколько каталогов на наличие файлов с указанным расширением,
// нет подкаталогов
$files = scanDir :: scan ( $dirs , "jpg" );
//или с массивом расширений
$file_ext = array(
"jpg" ,
"bmp" ,
"png"
);
$files = scanDir :: scan ( $dirs , $file_ext );

// Сканируем несколько каталогов на наличие файлов с любым расширением,
// включаем файлы в рекурсивные подпапки
$files = scanDir::scan ( $dirs , false , true );

// Несколько каталогов с указанными расширениями включают файлы подкаталогов
$files = scanDir::scan ( $dirs , $file_ext , true );
?>

Scandir на стероидах:
На случай, если вы хотите отфильтровать список файлов или просто перечислить несколько уровней подкаталогов.

function dirList ( $path = "" , $types = 2 , $levels = 1 , $aFilter =array()) <
// возвращает массив указанных файлов/каталогов
/ / начать поиск в $path (по умолчанию текущий рабочий каталог)
// return $types: 2 => files; 1 => каталоги; 3 => оба;
// $levels: 1 => смотреть только в $path; 2 => $path и все дочерние элементы;
// 3 => $путь, дети, внуки; 0 => $path и все подкаталоги;
// меньше 0 => дополнение -$levels, ИЛИ все, начиная с -$levels вниз
// например. -1 => все, кроме $path; -2 => все потомки, кроме $path + children
// Оставшиеся аргументы представляют собой фильтрующий массив (список) регулярных выражений, которые работают с полным путем.
// Первый символ (перед '/' в регулярном выражении) '-' => НЕ.
// Первый символ (после возможного '-') 'd' => применяется к имени каталога
// Фильтры могут быть переданы как массив строк или как список строк
// Обратите внимание, что выходные каталоги имеют префикс '*' (делается в строке над возвратом)
$dS = DIRECTORY_SEPARATOR ;
if (!( $path = realpath ( $path ? $path : getcwd ()))) return array(); // неверный путь
// следующая строка избавляет от завершения \ на дисках (работает, поскольку c: == c:\ в PHP). ОК в *nix?
if (substr ($path,-1)==$dS) $path = substr($path,0,-1);
if ( is_null ( $types )) $types = 2 ;
если ( is_null ( $levels )) $levels = 1 ;
if ( is_null ( $aFilter )) $aFilter =array();

// последний аргумент может быть передан как список или как массив
$aFilter = array_slice ( func_get_args (), 3 );
if ( $aFilter && gettype ( $aFilter [ 0 ])== "массив" ) $aFilter = $aFilter [ 0 ];
$adFilter = array();
// теперь перемещаем фильтры каталогов в отдельный массив:
foreach ( $aFilter as $i => $filter ) // для каждого фильтра каталогов.
if (( $pos = stripos (" $filter " , "d" )) && $pos < 3 ) < // следующая строка удаляет 'd'
$adFilter [] = substr ( $ фильтр, 0, $pos-1). substr($filter, $pos);
отменить( $aFilter [ $i ]); >
$aFilter = array_merge ( $aFilter ); // сбросить индексы

$aRes = массив(); // результаты, $aAcc является аккумулятором
$aDir = array( $path ); // каталоги для проверки
на наличие ( $i = $levels > 0 ? $levels ++:- 1 ;( $aAcc =array())|| $i --&& $aDir ; $aDir = $aAcc )
while ( $dir = array_shift ( $aDir ))
foreach ( scandir ( $dir ) as $fileOrDir )
if ( $fileOrDir != "." && $fileOrDir != " .." ) <
if ( $dirP = is_dir ( $rp = " $dir$dS$fileOrDir " ))
if ( pathFilter (" $rp$dS " , $adFilter ))
$aAcc [] = $rp ;
if ( $i < $levels - 1 && ( $types & ( 2 - $dirP )))
if ( pathFilter ( $rp , $aFilter ))
$aRes [] = ($dirP? "*": ""). $ рп ; >
вернуть $aRes ;
>
?>

пример использования:
define ( "_" , NULL );
// все файлы, кроме .jpg и .Thumbs.db, будут найдены в каталоге c:\Photo
$aFiles = dirList ( 'c:\Photo' , _ , 0 , '-/\. jpg$/i' , '-/\\\\Thumbs.db$/' );
$aFiles = dirList(); // найти файлы в текущем каталоге
// в следующих строках будут найдены файлы .jpg в подкаталогах, отличных от фотографий, за исключением временных файлов Интернета
set_time_limit ( 60 ); // повторение с верхнего уровня может занять некоторое время
$aFiles = dirList( "c:\\" , _ , 0 , '/\.jpg$/i' , '-d/\\\\Photos ?$/i', '-d/Временный Интернет/i');
?>

Обратите внимание, что эта функция займет много времени при сканировании больших
структур каталогов (что является причиной использования фильтров '[-]d/. /'). ).

Чаба Габор из Вены

scandir() с соответствием регулярному выражению имени файла и параметрами сортировки на основе stat().

function myscandir ($dir, $exp, $how = 'name', $desc = 0)
<
$r = array();
$dh = @ opendir ( $dir );
if ( $dh ) <
в то время как (( $fname = readdir ( $dh )) !== false ) <
if ( preg_match ( $exp , $fname )) <
$stat = stat("$dir / $fname");
$r [ $fname ] = ( $how == 'имя' )? $fname : $stat [ $how ];
>
>
closedir ( $dh );
if ( $desc ) <
arsort ( $r );
>
else <
сортировать ( $r );
>
>
возврат( array_keys ( $r ));
>

$r = myscandir('./book/', '/^article7\.txt$/i', 'ctime', 1);
print_r ($r);
?>

файлы можно сортировать по имени и атрибутам stat(), по возрастанию и убыванию:

имя имя файла
номер устройства dev
номер инода ino
режим инода режима защиты
nlink количество ссылок
uid userid владельца
gid groupid владельца
тип устройства rdev, если устройство inode *
размер размер в байтах
atime время последнего доступа (отметка времени Unix)
mtime время последней модификации (отметка времени Unix)
ctime время последнего изменения индекса (метка времени Unix)
blksize размер блока файловой системы IO *
blocks количество выделенных блоков

/**
* Эта функция будет рекурсивно сканировать все файлы во вложенной папке и папке.
*
* @author Fazle Elahee
*
*/

if(!empty($lists))
foreach($lists as $f)

$path = "/var/www/SimplejQueryDropdowns";
$file_names = scanFileNameRecursivly($path);

Читайте также: