Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Дерево папок

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Пытаюсь написать код, который просканирует все подпапки, начиная, от заданной и создаст список папок с подфайлами...
riartem
Отправлено: 28 Октября, 2010 - 12:31:50
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Май 2008  


Помог: 0 раз(а)




Вот столкнулся с проблемой.. Хочу написать код, который просканирует все подпапки, начиная, от заданной и создаст список папок с подфайлами...
Но из-за недостатка знаний в php не работает.. вернее, работает, но не так..
Мой код отдаёт вначале список папок, а потом уже список файлов, а мне нужно, чтобы перед именем файла был "таб" (ну, отступ, чтобы потом в дерево впихнуть) ..
Нужно примерно так:
CODE (htmlphp):
скопировать код в буфер обмена
  1. Корневая папка:
  2. Подпапка1
  3.    Файл
  4.    Файл2
  5.    Файл3
  6. Подпапка2
  7.    Файл
  8.    Файл2
  9. Подпапка3
  10.    Файл
  11.    Файл2

Помогите кто чем может, пожалуйста...
Вот привожу мой код.. Просьба не пинать))):
PHP:
скопировать код в буфер обмена
  1.  // Сканируем корневую папку
  2. $file_list = scandir($progDir."/docs");
  3. // Выпиливаем из массива полученных элементов 2 первых, ибо это . и .., а они нам нафиг нужны...
  4. array_splice($file_list, 0, 2);
  5. // Считаем количество элементов
  6. $colvo = count($file_list);
  7. // Смотрим
  8. $i = 0;
  9. do {
  10. $qw = $progDir."docs\\".$file_list[$i]; //Для удобства помещаем адрес элемента в переменную
  11.         if(is_dir($qw)) { //Если папка, то заглянем внутрь
  12.         $file_podlist = scandir($qw);
  13.  
  14. array_splice($file_podlist, 0, 2);
  15. $i2 = 0;
  16. $podcolvo = count($file_podlist);
  17. do {
  18. $file_list[] = ' '.$file_podlist[$i2];
  19. $i2 = $i2 + 1;
  20. } while ($i2 < $podcolvo);
  21.         };
  22. $colvo = count($file_list);
  23. $i = $i + 1;
  24. } while ($i < $colvo);
  25. //
  26.  
  27. // Удаляем расширения файлов, чтобы глаза не мозолили в дереве
  28. $file_list = str_replace(".htm","",$file_list);
  29.  
  30. // Ну вроде и всё.. Сейчас на выходе в массиве $file_list должна быть инфа о папках и вложенных в них файлах...


Помогите допилить, плиз, чтоб работало?!
 
 Top
Мелкий Супермодератор
Отправлено: 28 Октября, 2010 - 14:20:42
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Такую задачу куда удобнее реализовывать рукурсивно:
PHP:
скопировать код в буфер обмена
  1. function fstree($dir=".") {
  2. if (is_dir($dir)) {
  3.     //немного разметки
  4.     echo $dir,":<br><ul>";
  5.     if ($dh = opendir($dir)) {
  6.         while (($file = readdir($dh)) !== false) {
  7.             if ($file=='..' || $file=='.') continue;
  8.             echo "<li>";
  9.             //if (isdir($file)) fstree($dir."/".$file); //уходим в рекурсию; честно, не помню, надо ли / вставлять, вроде надо
  10.             if (is_dir($dir."/".$file)) fstree($dir."/".$file);
  11.             //а здесь выводим файлы директории
  12.             else echo $file,PHP_EOL;
  13.             echo "</li>";
  14.         }
  15.         closedir($dh);
  16.     }
  17.     //echo "</li>";
  18.     echo "</ul>";
  19. }
  20. }
  21. fstree();


Если нужно ограничить вложенность, то это удобно сделать вторым параметром:
Спойлер (Отобразить)


PS: писал сходу, мог где наврать.

(Отредактировано автором: 28 Октября, 2010 - 16:14:08)



-----
PostgreSQL DBA
 
 Top
riartem
Отправлено: 28 Октября, 2010 - 15:13:30
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Май 2008  


Помог: 0 раз(а)




Спасибо за ответ... Но что-то работает не до конца.. Некоторые папки выводит, некоторые - нет...
Вот листинг для диска C:/ ...
CODE (htmlphp):
скопировать код в буфер обмена
  1. C:/:<br><ul><li>$Recycle.Bin
  2. </li><li>ATI
  3. </li><li>autoexec.bat
  4. </li><li>config.sys
  5. </li><li>Documents and Settings
  6. </li><li>Games
  7. </li><li>hiberfil.sys
  8. </li><li>IO.SYS
  9. </li><li>MSDOS.SYS
  10. </li><li>MSOCache
  11. </li><li>pagefile.sys
  12. </li><li>PerfLogs
  13. </li><li>Program Files
  14. </li><li>ProgramData
  15. </li><li>Recovery
  16. </li><li>System Volume Information
  17. </li><li>Users
  18. </li><li>Windows
  19. </li></li>

Неуж-то все папки пустые?! )
 
 Top
CenapaTop
Отправлено: 28 Октября, 2010 - 15:23:25
Post Id



Частый гость


Покинул форум
Сообщений всего: 166
Дата рег-ции: Авг. 2009  


Помог: 1 раз(а)




PHP:
скопировать код в буфер обмена
  1. if (is_dir($file)) fstree($dir."/".$file);
 
 Top
riartem
Отправлено: 28 Октября, 2010 - 15:27:13
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Май 2008  


Помог: 0 раз(а)




Совсем результат не изменился((
 
 Top
Мелкий Супермодератор
Отправлено: 28 Октября, 2010 - 15:43:05
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Любопытно, а где фатал еррор об отсутствии функции isdir в строке 9? Она действительно is_dir должна называться...
(Добавление)
PHP:
скопировать код в буфер обмена
  1. if (is_dir($dir."/".$file)) fstree($dir."/".$file);

относительные пути...
Так строит дерево, проверил.


-----
PostgreSQL DBA
 
 Top
riartem
Отправлено: 28 Октября, 2010 - 16:06:30
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Май 2008  


Помог: 0 раз(а)




isdir я сразу заметил.. тихонько исправил, думаю, просто опечатка..
хм.. ну, я вижу, что мы почти у цели, но всё-равно не то...
Смотрите.. у меня на самом деле такая структура:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. docs
  3.    Папка1
  4.       Документ1.хтм
  5.       Документ2.хтм
  6.    Папка2
  7.       Документ1.хтм
  8.  

А программа выводит:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. docs
  3.    Папка1
  4.       Документ1.хтм
  5.       Документ2.хтм
  6.       Папка2
  7.          Документ1.хтм
  8.  
 
 Top
SAD Модератор
Отправлено: 28 Октября, 2010 - 16:10:49
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2508
Дата рег-ции: Май 2009  
Откуда: Днепропетровск, Украина


Помог: 75 раз(а)




у вас не хватает закрывающихся/ открывающихся тегов ul/li
и возможно, они стоят не там где надо
или стоят лишние
взять хотя бы последний li - он закрывает то, чего нет, должен стоять </ul>
 
 Top
Мелкий Супермодератор
Отправлено: 28 Октября, 2010 - 16:12:05
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




А что, на вложенность директорий забить надо? И какой тогда от этого полезный толк?

А, если по форматированию именно - тег ul не закрыт, я исправил, проверил, и забыл.

(Отредактировано автором: 28 Октября, 2010 - 16:13:12)



-----
PostgreSQL DBA
 
 Top
riartem
Отправлено: 28 Октября, 2010 - 16:19:56
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Май 2008  


Помог: 0 раз(а)




Ураа! Спасибо огромное всем!
Действительно, если заменить последний li на ul, то всё супер!!!
Спасибо, парни! Вы меня очень выручили!
А вот, что исправить, чтобы папки были без адресов, а просто имена папок?

Ну и ul li лучше заменить на отступы "tab" (очень надо, а то начал менять - всё расползается)
(Добавление)
Вообще, я пишу в DevelStudio, поэтому код немного другой, но смысл практически тот же...
Выложу сюда финал с табами, может кому пригодится...
PHP:
скопировать код в буфер обмена
  1.  
  2.  $addr = $progDir.'docs/';
  3. // $addr = "C:/";
  4.  
  5. function fstree($dir, $vl=0) {
  6. if ($vl < 0) { $mem = c("memo1")->text;
  7.     $mem = $mem."слишком глубоко ушли";
  8.     c("memo1")->text = $mem; };
  9. if (is_dir($dir)) {
  10.     //немного разметки
  11.    // echo $dir,":<br><ul>";
  12.     $mem = c("memo1")->text;
  13.     $mem = $mem.$dir."\n";
  14.     c("memo1")->text = $mem;
  15.     if ($dh = opendir($dir)) {
  16.         while (($file = readdir($dh)) !== false) {
  17.             if ($file=='..' || $file=='.') continue;
  18.          //   echo "<li>";
  19.             $mem = c("memo1")->text;
  20.     $mem = $mem.""; ///!
  21.     c("memo1")->text = $mem;
  22.     if (is_dir($dir."/".$file)) fstree($dir."/".$file);
  23.    // if (is_dir($file)) fstree($dir."/".$file,$vl-1); //уходим в рекурсию; честно, не помню, надо ли / вставлять
  24.             //а здесь выводим файлы директории
  25.             else {
  26.             $mem = c("memo1")->text;
  27.     $mem = $mem."       ".$file.PHP_EOL;
  28.     c("memo1")->text = $mem; };
  29.         //    echo $file,PHP_EOL;
  30.            // echo "</li>";
  31.            $mem = c("memo1")->text;
  32.     $mem = $mem.""; ///li
  33.     c("memo1")->text = $mem;
  34.         }
  35.         closedir($dh);
  36.     }
  37.   //  echo "</li>";
  38.   $mem = c("memo1")->text;
  39.     $mem = "".$mem;
  40.     c("memo1")->text = $mem;
  41.     c("htmlView1")->html = $mem;
  42. }
  43. }
  44. fstree($addr,2);
  45.  


Остался единственный вопрос, по поводу убирания полного пути папок...

(Отредактировано автором: 28 Октября, 2010 - 16:25:16)

 
 Top
SAD Модератор
Отправлено: 28 Октября, 2010 - 16:49:52
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2508
Дата рег-ции: Май 2009  
Откуда: Днепропетровск, Украина


Помог: 75 раз(а)




PHP:
скопировать код в буфер обмена
  1. $folderName = end(split('/', $path/*путь_к_папке*/));
 
 Top
riartem
Отправлено: 28 Октября, 2010 - 16:55:14
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Май 2008  


Помог: 0 раз(а)




SAD пишет:
PHP:
скопировать код в буфер обмена
  1. $folderName = end(split('/', $path/*путь_к_папке*/));

Сейчас мозг вскипит.. куда это писать?! (((
(Добавление)
Всё, разобрался, не могу лишь найти, где выводится самая первая строка с наименованием текущей папки?!
 
 Top
Мелкий Супермодератор
Отправлено: 28 Октября, 2010 - 17:35:50
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




riartem пишет:
где выводится самая первая строка с наименованием текущей папки?!

Там же, где и все остальные, в 13-ой строке по вашему листингу. В этом вся прелесть рекурсии.


-----
PostgreSQL DBA
 
 Top
riartem
Отправлено: 28 Октября, 2010 - 18:14:34
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Май 2008  


Помог: 0 раз(а)




Можно сделать, чтобы она вообще исчезла?
 
 Top
AG
Отправлено: 08 Февраля, 2011 - 14:23:30
Post Id


Новичок


Покинул форум
Сообщений всего: 1
Дата рег-ции: Февр. 2011  


Помог: 0 раз(а)




Вот я заморочился и на основе предыдущего кода с использованием treeview из jQuery:
PHP:
скопировать код в буфер обмена
  1. // $addr = "C:/";
  2. $addr = '/tmp';
  3. echo '<ul id="browser" class="filetree">';
  4. fstree($addr);
  5. echo '</ul>';
  6.  
  7. function fstree($dir) {
  8. // если мы сюда попали, значит уже в папке
  9.   echo '<li><span class="folder">'.end(split('/', $dir)).'</span><ul>';
  10.   if ($dh = opendir($dir)) {
  11.     while (($file = readdir($dh)) !== false) {
  12.       if ($file=='..' || $file=='.') continue;
  13. // Если папка, входим в рекурсию
  14.       if (is_dir($dir."/".$file)) {
  15.         fstree($dir."/".$file);
  16.       }
  17. // Если нет - рисуем файл
  18.       else {
  19.         echo '<li><span class="file">'.$file.' [size: '.filesize($dir.'/'.$file).' bytes]</span></li>',PHP_EOL;
  20.       }
  21.     }
  22.   closedir($dh);
  23.   }
  24.   echo "</ul></li>";
  25. }

все li ul span нужны только для treeview.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Напишите за меня, пожалуйста »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB