[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Не правильно выводит файлы диретории readdir
sharki
Всем привет, столкнулся с проблемой сканирования директорий и их вложенности, вот код

if ($handle = opendir($_SERVER['DOCUMENT_ROOT'] . '/')) {
echo "<ul>";

while (false !== ($file = readdir($handle))) {

echo "<li>" . $file . "</li>";
if(is_dir($file)) { // если в данной итерации обнаруживается директория то прооходим по ней циклом
if ($handle2 = opendir($_SERVER['DOCUMENT_ROOT'] . '/' . $file)) {
echo "<ul>";
while (false !== ($file2 = readdir($handle2))) {
echo "<li>" . $file2 . "</li>"; // выводим файлы вложенной директории
}
closedir($handle2); // закрываем вложенную директорию
echo "</ul>";
}
}

}


closedir($handle); // закрываем основную директорию по окончанию всех действий
echo "</ul>";
}


Выводит он это

    * .
o .
o ..
o index.html
o index.php
o js.js
o my.css
o news
o test.php
* ..
o .
o ..
o www
* index.html // ВОТ С ЭТОГО МОМЕНТА ВСЕ НОРМ, а то что выше откуда? О_О
* index.php
* js.js
* my.css
* news
o .
o ..
o file.txt
* test.php



Как выглядят файлы и папки на компе прикрепляю.



Спустя 15 минут, 18 секунд (25.01.2011 - 19:03) Invis1ble написал(а):
sharki
У меня имеется код, попробуй разобраться, думаю он тебе поможет. Я его правда давненько писал, и там есть некоторые недочеты, но в целом алгоритм нормальный
<?php
error_reporting(E_ALL | E_STRICT);
ini_set('max_execution_time', 0);
ini_set('memory_limit', 0);

function search($item)
{
global $count;

if (!is_dir($item) && preg_match('#.php$#i', $item))
{
$count ++;
$strings = file($item);

foreach ($strings as $string)
{
if (preg_match('#\$_SERVER#i', $string))
echo '<span style="font-family: Verdana, Arial, sans-serif; font-size: 12px; color: red">Found file: <b>'.$item.' ,</b> string: <b>'.htmlspecialchars($string).'</b></span><br/>';
}
}

elseif (is_dir($item))
{
$items = glob($item.'/*', GLOB_NOSORT);

foreach ($items as $item)
{
search($item);
}
}


return $count;
}

$items = glob('../forum/*', GLOB_NOSORT);

$count = 0;

foreach ($items as $item)
{
$amountFile = search($item);
}

echo '<div style="font-family: Verdana, Arial, sans-serif; font-size: 15px; margin-top: 15px;">Поиск завершен. Просканировано <b>'.$count.'</b> файлов.</div>';

glob() замени на scandir(), ну и поиск текста в файлах думаю тебе не нужен

Спустя 14 минут, 41 секунда (25.01.2011 - 19:18) sharki написал(а):
Хорошо, гляну че и как тут =))

Спустя 53 минуты, 51 секунда (25.01.2011 - 20:12) sharki написал(а):
Понял в чем прикол для функции is_dir() - "." и ".." являются директориями, и цикл тупо выводил все файлы из этих директорий, решил так

$file2 = scandir($_SERVER['DOCUMENT_ROOT']);
print_r($file2);
echo "<ul>";
foreach ($file2 as $val) {
if ($val !== "." && $val !== ".." ){
echo "<li>" . $val . "</li>";
if(is_dir($val)) {
$file3 = scandir($val);
echo "<ul>";
foreach ($file3 as $val2) {
if ($val2 !== "." && $val2 !== ".." ){
echo "<li>" . $val2 . "</li>";
}
}

echo "</ul>";
}
}
}

echo "</ul>";


выводит так

* index.html
* index.php
* js.js
* my.css
* news
o file.txt
* test.php

Спустя 8 минут, 49 секунд (25.01.2011 - 20:21) Invis1ble написал(а):
Вот как я сделал
<?php
error_reporting(E_ALL | E_STRICT);
set_time_limit(0);

function scan($path)
{
if (is_dir($path))
{
echo '<ul>';
echo 'Directory: ' . $path . '<br />';

$items = glob($path . '/*', GLOB_NOSORT);

foreach ($items as $item)
scan($item);

echo '</ul>';
}
else
echo '<li style="margin-left: 55px;">File: ' . $path . '</li>';
}

$path = 'C:/www/html/IRBIS-core';
scan($path);


ПС. А твой код походу только для ограниченной вложенности корректно сработает.... 3 уровня насколько понял

Спустя 5 минут, 58 секунд (25.01.2011 - 20:27) sharki написал(а):
Invis1ble
А вот новая твоя функция, для всех уровней?

PS я щас пробую свою доработать до бесконечной вложенности

Спустя 2 минуты, 41 секунда (25.01.2011 - 20:29) Invis1ble написал(а):
sharki
Цитата
А вот новая твоя функция, для всех уровней?

Да, я уже и отступы подправил, посмотри код
Цитата
PS я щас пробую свою доработать до бесконечной вложенности

до бесконечной не получится, максимум 100 уровней для рекурсии - дальше Fatal Error выбрасывается. Но на практике я не думаю, что у тебя будет более 100 уровней wink.gif

Спустя 45 минут, 32 секунды (25.01.2011 - 21:15) sharki написал(а):
Что в этой функции не правильно? он зацикливается...
Уже много разных способов рекурсии сделал тоже самое...
function opdir ($put) {
$arr = scandir($put);
echo "<ul>";
foreach ( $arr as $fid ) {
if ($fid !== "." and $fid !== "..") {
if(is_dir($fid)) {
opdir ($fid);
}
else {
echo "<li>" . $fid . "</li>";
}
}
}

echo "</ul>";
}

opdir ($_SERVER['DOCUMENT_ROOT']);

Спустя 16 минут, 57 секунд (25.01.2011 - 21:32) Invis1ble написал(а):
sharki
Я же тебе показал рабочий вариант, сравни =)

Спустя 2 минуты, 12 секунд (25.01.2011 - 21:34) sharki написал(а):
Invis1ble
Если твой вариант переделать под scandir т.е тупо заменить glob , то тоже подвисает полностью...чет я в недоумении

Спустя 5 минут, 4 секунды (25.01.2011 - 21:39) Invis1ble написал(а):
а вобще, scandir() возвращает не пути, а названия, из-за этого функция некорректно срабатывает при рекурсивном вызове... но у тебя там еще в логике ошибки )

Спустя 10 минут, 48 секунд (25.01.2011 - 21:50) sharki написал(а):
С логикой я разобрался, а вот из-за чистых имен получилась неразбериха =)) Спасибо за помощь

Спустя 57 минут, 17 секунд (25.01.2011 - 22:47) linker написал(а):
Никакого прикола тут нет, "." и ".." и есть директории, только первая указывает на саму себя, а вторая на родительскую.

Спустя 35 минут, 45 секунд (25.01.2011 - 23:23) Snus написал(а):
Цитата (sharki @ 25.01.2011 - 15:48)
if ($handle = opendir($_SERVER['DOCUMENT_ROOT'] . '/')) {

$_SERVER['DOCUMENT_ROOT']

У тебя home, а не www рутом является.

Спустя 2 минуты, 4 секунды (25.01.2011 - 23:25) Snus написал(а):
Извиняюсь, прогрядел. linker прав.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.