<?php
function DirTraversalNoRecursion ($StartDir)
{
//Хэндлы каталогов, к которым надо вернуться
$dirHandles = array();
//Имена каталогов, к которым надо вернуться
$dirNames = array();
//Храним имена файлов, которые мы обошли, если их надо вернуть из функции
$filenames = array();
//Открываем начальный каталог
$currDirHandle = opendir($StartDir);
if (! $currDirHandle) {
die('Ошибка открытия корневого каталога для сканирования!');
}
$currDirName = $StartDir;
//Перебираем все папки, начиная с корня
while ($currDirHandle !== NULL) {
//Читаем текущую папку
while (($file = readdir($currDirHandle)) !== false) {
//Пропускаем "." и ".." каталоги
if(is_dir($currDirName . '/' . $file) and $file[0]=='.') {
continue;
}
//Если встретили папку -
if (is_dir($currDirName . '/' . $file)) {
//запоминаем текущую в стеке
array_push($dirHandles, $currDirHandle);
array_push($dirNames, $currDirName);
//Переключаемся на сканирование встреченной папки
$currDirHandle = opendir($currDirName . '/' . $file);
$currDirName = $currDirName . '/' . $file;
continue;
}
//Запоминаем имя файла для возврата
$filenames[] = $currDirName . '/' . $file;
//На всякий выводим на консоль
echo($currDirName . '/' . $file."\r\n");
}
//Закрываем хэндл пройденного каталога
closedir($currDirHandle);
//Забираем из стека каталог, на котором мы остановились для продолжения обхода
$currDirHandle = array_pop($dirHandles);
$currDirName = array_pop($dirNames);
//Продолжаем обход. array_pop вернет NULL, если для продолжения обхода больше нет каталогов
}
//Возвращаем встреченные имена файлов
return $filenames;
}
$filenames = DirTraversalNoRecursion('C:/Temp');
?>