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
У меня имеется код, попробуй разобраться, думаю он тебе поможет. Я его правда давненько писал, и там есть некоторые недочеты, но в целом алгоритм нормальный
glob() замени на scandir(), ну и поиск текста в файлах думаю тебе не нужен
У меня имеется код, попробуй разобраться, думаю он тебе поможет. Я его правда давненько писал, и там есть некоторые недочеты, но в целом алгоритм нормальный
<?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 написал(а):
Вот как я сделал
ПС. А твой код походу только для ограниченной вложенности корректно сработает.... 3 уровня насколько понял
<?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 я щас пробую свою доработать до бесконечной вложенности
А вот новая твоя функция, для всех уровней?
PS я щас пробую свою доработать до бесконечной вложенности
Спустя 2 минуты, 41 секунда (25.01.2011 - 20:29) Invis1ble написал(а):
sharki
Цитата |
А вот новая твоя функция, для всех уровней? |
Да, я уже и отступы подправил, посмотри код
Цитата |
PS я щас пробую свою доработать до бесконечной вложенности |
до бесконечной не получится, максимум 100 уровней для рекурсии - дальше Fatal Error выбрасывается. Но на практике я не думаю, что у тебя будет более 100 уровней

Спустя 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 , то тоже подвисает полностью...чет я в недоумении
Если твой вариант переделать под 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 прав.