Класс DirectoryIterator
(PHP 5, PHP 7)
Введение
Класс DirectoryIterator предоставляет простой интерфейс для просмотра содержимого каталогов файловой системы.
Обзор классов
/* Методы */
}Содержание
- DirectoryIterator::__construct — Создаёт новый итератор директорий по пути
- DirectoryIterator::current — Возвращает текущий элемент DirectoryIterator
- DirectoryIterator::getATime — Возвращает время последнего доступа к текущему элементу DirectoryIterator
- DirectoryIterator::getBasename — Возвращает имя файла (без расширения) текущего элемента DirectoryIterator
- DirectoryIterator::getCTime — Возвращает время последнего изменения i-узла текущего элемента DirectoryIterator
- DirectoryIterator::getExtension — Возвращает расширение файла
- DirectoryIterator::getFilename — Возвращает имя файла текущего элемента DirectoryIterator
- DirectoryIterator::getGroup — Возвращает идентификатор группы текущего элемента DirectoryIterator
- DirectoryIterator::getInode — Возвращает inode текущего элемента DirectoryIterator
- DirectoryIterator::getMTime — Возвращает время последнего изменения текущего элемента DirectoryIterator
- DirectoryIterator::getOwner — Возвращает идентификатор владельца текущего элемента DirectoryIterator
- DirectoryIterator::getPath — Возвращает путь к текущему элементу DirectoryIterator без имени файла
- DirectoryIterator::getPathname — Возвращает путь и имя файла текущего элемента DirectoryIterator
- DirectoryIterator::getPerms — Возвращает набор прав для текущего элемента DirectoryIterator item
- DirectoryIterator::getSize — Возвращает размер текущего элемента DirectoryIterator
- DirectoryIterator::getType — Определяет тип текущего элемента DirectoryIterator
- DirectoryIterator::isDir — Определяет, является ли текущий элемент DirectoryIterator директорией
- DirectoryIterator::isDot — Определяет, является ли текущий элемент DirectoryIterator '.' или '..'
- DirectoryIterator::isExecutable — Определяет, является ли текущий элемент DirectoryIterator исполняемым
- DirectoryIterator::isFile — Определяет, является ли текущий элемент DirectoryIterator обычным файлом
- DirectoryIterator::isLink — Определяет, является ли текущий элемент DirectoryIterator символической ссылкой
- DirectoryIterator::isReadable — Определяет, доступен ли текущий элемент DirectoryIterator для чтения
- DirectoryIterator::isWritable — Определяет, доступен ли текущий элемент DirectoryIterator для записи
- DirectoryIterator::key — Возвращает ключ текущего элемента DirectoryIterator
- DirectoryIterator::next — Перемещает указатель на следующий элемент DirectoryIterator
- DirectoryIterator::rewind — Устанавливает указатель на первый элемент DirectoryIterator
- DirectoryIterator::seek — Перемещает указатель DirectoryIterator на определённую позицию
- DirectoryIterator::__toString — Возвращает имя файла в виде строки
- DirectoryIterator::valid — Проверяет, является ли текущий элемент DirectoryIterator допустимым файлом
- PHP Руководство
- Функции по категориям
- Индекс функций
- Справочник функций
- Другие базовые расширения
- Стандартная библиотека PHP (SPL)
- Класс AppendIterator
- Класс ArrayIterator
- Класс CachingIterator
- Класс CallbackFilterIterator
- Класс DirectoryIterator
- Класс EmptyIterator
- Класс FilesystemIterator
- Класс FilterIterator
- Класс GlobIterator
- Класс InfiniteIterator
- Класс IteratorIterator
- Класс LimitIterator
- Класс MultipleIterator
- Класс NoRewindIterator
- Класс ParentIterator
- Класс RecursiveArrayIterator
- Класс RecursiveCachingIterator
- Класс RecursiveCallbackFilterIterator
- Класс RecursiveDirectoryIterator
- Класс RecursiveFilterIterator
- Класс RecursiveIteratorIterator
- Класс RecursiveRegexIterator
- Класс RecursiveTreeIterator
- Класс RegexIterator
Коментарии
DirectoryIterator::getBasename() has been also been available since 5.2.2, according to the changelog (not documented yet). It takes a parameter $suffix, and is useful if, for instance, you use a naming convention for your files (e.g. ClassName.php).
The following code uses this to add recursively All*Tests.php in any subdirectory off of tests/, basically, suites of suites.
<?php
// PHPUnit boilerplate code goes here
class AllTests {
public static function main() {
$parameters = array('verbose' => true);
PHPUnit_TextUI_TestRunner::run(self::suite(), $parameters);
}
public static function suite() {
$suite = new PHPUnit_Framework_TestSuite('AllMyTests'); // this must be something different than the class name, per PHPUnit
$it = new AllTestsFilterIterator(
new RecursiveIteratorIterator(
new RecursiveDirectoryIterator(dirname(__FILE__) . '/tests')));
for ($it->rewind(); $it->valid(); $it->next()) {
require_once($it->current());
$className = $it->current()->getBasename('.php');
$suite->addTest($className::suite());
}
return $suite;
}
}
?>
Also, the AllTestsFilterIterator above extends FilterIterator, and contains one method, accept():
<?php
class AllTestsFilterIterator extends FilterIterator {
public function accept() {
if (preg_match('/All.*Tests\.php/', $this->current())) {
return true;
} else {
return false;
}
}
}
?>
Shows us all files and catalogues in directory except "." and "..".
<?php
foreach (new DirectoryIterator('../moodle') as $fileInfo) {
if($fileInfo->isDot()) continue;
echo $fileInfo->getFilename() . "<br>\n";
}
?>
Beware of the behavior when using FilesystemIterator::UNIX_PATHS, it's not applied as you might expect.
I guess this flag is added especially for use on windows.
However, the path you construct the RecursiveDirectoryIterator or FilesystemIterator with will not be available as a unix path.
I can't say this is a bug, since most methods are just purely inherited from DirectoryIterator.
In my test, I'd expected a complete unix path. Unfortunately... not quite as expected:
<?php
// say $folder = C:\projects\lang
$flags = FilesystemIterator::KEY_AS_PATHNAME | FilesystemIterator::CURRENT_AS_FILEINFO | FilesystemIterator::SKIP_DOTS | FilesystemIterator::UNIX_PATHS;
$d_iterator = new RecursiveDirectoryIterator($folder, $flags);
echo $d_iterator->getPath();
?>
expected result: /projects/lang (or C:/projects/lang)
actual result: C:\projects\lang
DirectoryIterator is just an lightweight SplFileInfo iterator and its methods operate on whatever item the internal cursor points to. In other words:
<?php
$iterator = new DirectoryIterator('C:\\');
echo $iterator->getPathname();
?>
... will NOT print "C:\" but the path of the first file or subdirectory retrieved, e.g. "C:\$Recycle.Bin".