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
Форумы портала PHP.SU :: Версия для печати :: Дерево папок
Форумы портала PHP.SU » PHP » Напишите за меня, пожалуйста » Дерево папок

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

1. riartem - 28 Октября, 2010 - 12:31:50 - перейти к сообщению
Вот столкнулся с проблемой.. Хочу написать код, который просканирует все подпапки, начиная, от заданной и создаст список папок с подфайлами...
Но из-за недостатка знаний в 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 должна быть инфа о папках и вложенных в них файлах...


Помогите допилить, плиз, чтоб работало?!
2. Мелкий - 28 Октября, 2010 - 14:20:42 - перейти к сообщению
Такую задачу куда удобнее реализовывать рукурсивно:
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: писал сходу, мог где наврать.
3. riartem - 28 Октября, 2010 - 15:13:30 - перейти к сообщению
Спасибо за ответ... Но что-то работает не до конца.. Некоторые папки выводит, некоторые - нет...
Вот листинг для диска 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>

Неуж-то все папки пустые?! )
4. CenapaTop - 28 Октября, 2010 - 15:23:25 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. if (is_dir($file)) fstree($dir."/".$file);
5. riartem - 28 Октября, 2010 - 15:27:13 - перейти к сообщению
Совсем результат не изменился((
6. Мелкий - 28 Октября, 2010 - 15:43:05 - перейти к сообщению
Любопытно, а где фатал еррор об отсутствии функции isdir в строке 9? Она действительно is_dir должна называться...
(Добавление)
PHP:
скопировать код в буфер обмена
  1. if (is_dir($dir."/".$file)) fstree($dir."/".$file);

относительные пути...
Так строит дерево, проверил.
7. riartem - 28 Октября, 2010 - 16:06:30 - перейти к сообщению
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.  
8. SAD - 28 Октября, 2010 - 16:10:49 - перейти к сообщению
у вас не хватает закрывающихся/ открывающихся тегов ul/li
и возможно, они стоят не там где надо
или стоят лишние
взять хотя бы последний li - он закрывает то, чего нет, должен стоять </ul>
9. Мелкий - 28 Октября, 2010 - 16:12:05 - перейти к сообщению
А что, на вложенность директорий забить надо? И какой тогда от этого полезный толк?

А, если по форматированию именно - тег ul не закрыт, я исправил, проверил, и забыл.
10. riartem - 28 Октября, 2010 - 16:19:56 - перейти к сообщению
Ураа! Спасибо огромное всем!
Действительно, если заменить последний 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.  


Остался единственный вопрос, по поводу убирания полного пути папок...
11. SAD - 28 Октября, 2010 - 16:49:52 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. $folderName = end(split('/', $path/*путь_к_папке*/));
12. riartem - 28 Октября, 2010 - 16:55:14 - перейти к сообщению
SAD пишет:
PHP:
скопировать код в буфер обмена
  1. $folderName = end(split('/', $path/*путь_к_папке*/));

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

Там же, где и все остальные, в 13-ой строке по вашему листингу. В этом вся прелесть рекурсии.
14. riartem - 28 Октября, 2010 - 18:14:34 - перейти к сообщению
Можно сделать, чтобы она вообще исчезла?
15. AG - 08 Февраля, 2011 - 14:23:30 - перейти к сообщению
Вот я заморочился и на основе предыдущего кода с использованием 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.

 

Powered by ExBB FM 1.0 RC1