Задача - рекурсивно пробежаться по директории и обработать специальным образом файлы. Делается функция, которая принимает параметр - путь к папке ($path) и выполняет следующее: PHP: <? (...) подключение к директории (opendir) цикл while (false !== ($file = readdir($folder_handle))) отбрасывание вариантов "." и ".." условие if (is_dir($file)) рекурсивный вызов с передачей $path . "/" . $file иначе обработка файла конец цикла отключение от директории. (closedir) (...) ?> Полностью код не привожу, он выдран из учебника (php.net). В таком исполнении is_dir классифицирует директории как файлы. Функция даёт сбой при попытке обработать директорию, как файл. Файловая система на носителе FAT32 (флешка). Тестовый сервер - комплект Денвер. php-5.1.6, Apache-1.3.31 Была предпринята попытка поменять is_dir($file) на !is_file($file). В результате условный блок классифицирует всё как директории. Функция даёт сбой при попытке открыть файл как папку. Применены "индусские" технологии: is_file($file) && !is_dir($file). Условный блок также даёт всё_директории. Юзал поиск на этом форуме по ключевикам "is_dir FAT32 не определяет файл директория не работает" в разных комбинациях. Пока копаю сам. Кто смог объехать эти грабли, буду признателен за совет. P.S. В тело цикла вставлено также вот это: clearstatcache(); Но, понятно, бестолку.
пхп4: PHP: function scandir($dir) { $dh = opendir($dir); $files=array(); while (false !== ($filename = readdir($dh))) { $files[] = $filename; } return $files; } $path=substr(strrchr($_POST['dir'], ":"), 1); echo 'path='. $path.'<br />'; echo 'b='. substr(strrchr($_POST['dir'], 10), 1 ).'<br />'; $d=strpos($_POST['dir'],':'); if ($d>-1) $drive=substr($_POST['dir'],0,$d); $weeds = array('.', '..'); $sizes=array(); $directories = array_diff(scandir($_POST['dir']), $weeds); foreach ($directories as $key=>$d) { echo '<br />'.$drive.":".$path."\\".$d.'<br />'; if (is_dir($drive.":".$path."\\".$d)) unset($directories[$key]); else $sizes[$d]=filesize($drive.":".$path."\\".$d); }
armadillo Scandir оно конечно да... но в теле основного кода здесь применяется всё тот же is_dir(), который в моём случае не работает корректно. Точнее, работает только в конструкции PHP: <? if (($file != ".") && ($file != "..") && !is_dir($file)) ?> В соответствии с этим примером, функция перестроена аналогичным образом, то есть сначала сканит директорию, потом выкидывает из полученного массива лишнее. Но при попытке установить принадлежность очередного "файла" к "директориям" даёт сбой. Сканируемые директории имеют названия вида xxx.yyy. То есть с расширением. Но дело, похоже, в файловой системе.
Если в конструкции if() стоит несколько условий, который разделены знаками "&&", то проверка на истинность идет слева направо. Если находится хоть один false, то последующие условия нет смысла проверять. Точка(.) и Две точки (..) являются директориями, таким образом, вместо условия: PHP: ($file != ".") && ($file != "..") && !is_dir($file) достаточно писать: PHP: !is_dir($file)