Я знаю, что могу сделать это…
glob('/dir/somewhere/*.zip');
… чтобы получить все файлы, заканчивающиеся на .zip
, но есть ли способ вернуть все файлы, которые не являются ZIP-файлами?
Или я просто перебираю и отфильтровываю их с этим расширением?
Я не думаю, что glob может сделать «не-подстановочный знак» …
Я вижу по крайней мере два других решения:
opendir
/ readdir
/ closedir
DirectoryIterator
; и, может быть, вы можете объединить его с некоторыми FilterIterator
? Вы всегда можете попробовать что-то вроде этого:
$all = glob('/dir/somewhere/*.*'); $zip = glob('/dir/somewhere/*.zip'); $remaining = array_diff($all, $zip);
Хотя, используя один из других методов, упомянутых Паскалем, может быть более эффективным.
Быстрое использование glob()
для всего и использование preg_grep()
для фильтрации файлов, которые вы не хотите.
preg_grep('#\.zip$#', glob('/dir/somewhere/*'), PREG_GREP_INVERT)
Также см. Шаблоны Глоба для сопоставления файлов в PHP
Эта модель будет работать:
glob('/dir/somewhere/*.{?,??,[!z][!i][!p]*}', GLOB_BRACE);
который находит все в / dir / where / end в точке, за которой следует либо
?
) ??
) [!z][!i][!p]*
) $dir = "/path"; if (is_dir($dir)) { if ($d = opendir($dir)) { while (($file = readdir($d)) !== false) { if ( substr($file, -3, 3) != "zip" ){ echo "filename: $file \n"; } } closedir($d); } }
NB: "." и ".." не позаботились. Для завершения операции OP