Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] listowanie i przegladanie folderow/plikow - problem
Forum PHP.pl > Forum > PHP
wilman
Witam!
Mam kod, który listuje mi zawartość katalogu. Katalog pobierany jest z adresu strony np index.php?katalog=./ , chciałbym zrobić tak, żeby można było swobodnie poruszać się po katalogach, a jeśli w katalogu są pliki to wydrukować do nich bezpośrednie linki np. qwe/rty/uiop/plik.rozszerzenie . W moim przypadku listowanie katalogu działa ale tylko do drugiego poziomu, a dalej drukuje mi nie taką ścieżkę jaką powinien. Czysto dla sprawdzenia w kodzie umieściłem żeby drukował [plik] lub [katalog] w zależności od typu drukowanej zawartości, ale przy drugim poziomie (katalog w katalogu) już się sypie bo przy folderach drukuje [plik].
  1. <? 
  2. if(empty($_GET['sciezka'])) { $_GET['sciezka']='./'; } 
  3. $folder = htmlspecialchars(nl2br(strip_tags($_GET['sciezka'])));
  4.  
  5. echo "Znajdujesz się w <b>$sciezka</b><br/><a href="javascript:history.go(-1)">[wróć]</a><br /> ";
  6. $dir = dir($folder);
  7. while ($file = $dir->read()) {
  8.  
  9. if (is_dir($file)) {
  10. $folder = substr($folder, 1);
  11. $adres = "<a href="index.php?sciezka=./$folder$file">$file [katalog]</a> n ";
  12. if (!(($file=='.') || ($file=='..')))
  13. $d[] = '[ '.$adres.' ]';
  14. } else {
  15. $adres = "<a href="/$folder/$file">$file [plik]</a>n ";
  16. $l[] = $adres; } 
  17. }
  18. $dir->close();
  19. if ((isset($d)) && (count($d)<>0))
  20. {
  21.  sort($d);
  22.  for ($i=0;$i<count($d);$i++)
  23. echo $d[$i]."<br />rn";
  24. }
  25. if ((isset($l)) && (count($l)<>0))
  26. {
  27.  sort($l);
  28.  for ($j=0;$j<count($l);$j++)
  29. echo $l[$j]."<br />rn";
  30. } else
  31.  echo('Katalog jest pusty!');
  32. ?>



Gdyby ktoś mógł mi pomóc, byłbym wdzięczny
Pozdrawiam

pe-es: jak zabezpieczyć ten skrypt ?
Wave
Użyj rekurencji ( napisz funkcję która indeksuje pliki a po napotkaniu katalogu wywołuje samą siebie ).
wilman
chyba nie zrozumiales oco mi chodzi, albo ja nie rozumiem Twojej wskazowki biggrin.gif

no bo jesli mam funkcje, ktora listuje pliki, natrafi na katalog i ma wywolac sie jeszcze raz, to co mi to da ?
Wave
To Ci da, że zindeksujesz wszystkie poziomy zamiast tylko dwóch.
wilman
to w takim razie ja nie rozumiem haha.gif

a patrzyles w moj kod, bo czysto teoretycznie powinno wszystko dzialac, a nie dziala bo popelnilem jakis blad, mozesz mi go pokazac ?
Wave
Linia 11:
  1. <?php
  2. $adres = "<a href="kat.php?sciezka=".$_GET['sciezka'].$file."/">$file [katalog]</a> n ";
  3. ?>
wilman
hmm...
dziala tak jak dzialalo, nadal na drugim sie sypie.
Czy nie wystarczy tylko poprawic tego kodu? Bo jezeli nie to napisze rekurencyjnie (o ile mi sie uda) tak jak pisales smile.gif
Wave
No, a zmieniłeś tak samo linię 15? W poprzednim kodzie zapomniałem dać index.php zamiast kat.php.
  1. <?php
  2. $adres = "<a href="".$_GET['sciezka'].$file."">$file [plik]</a>n ";
  3. ?>
wilman
tak, zmieniłem.
Na drugim poziomie przy kazdej pozycji drukuje [plik] wiec mniej wiecej wiadomo gdzie jest blad, ale nie wiem jak go poprawic sad.gif

edit:
tutaj jest przyklad dzialania ..
( w folderze 'stary' sa foldery 'bum' i 'bla' )
Coen
Cytat
Czy nie wystarczy tylko poprawic tego kodu? Bo jezeli nie to napisze rekurencyjnie (o ile mi sie uda) tak jak pisales

moim zdaniem pisanie czegos takiego nie-rekurencyjnie to masochizm w najczystszej postaci tongue.gif
robie aktualnie cos podobnego
byc moze moje wypociny beda uzyteczne, a juz napewno masz przyklad rekurencji
  1. <?php
  2. function DirTree($root_dir,$num,$heap)
  3.  {
  4. $heap[$num] = $root_dir.'/'; // <-- To jest taki niby stos tongue.gif
  5. $dir = implode(NULL,$heap);
  6. $tab = SetTabulator($num);
  7. $list = scandir($dir);
  8.  
  9. $output = '<table border="1" align="center" cellspacing="0" width="800">';
  10.  
  11. $list = SortList($dir,$list);
  12. for($i=2;$i<count($list);$i++)
  13. {
  14.  
  15.  if (is_dir($dir.$list[$i]))
  16.  {
  17.  
  18. $output .= '<tr><td><a href="run.php?name='.$list[$i].'">'.$list[$i].'</a></td><td align="right">DIR</td>'."n";
  19. if($_SESSION[$list[$i]] == 'open') 
  20. {
  21.  $output .= "n<tr><td>";
  22.  $output .= DirTree($list[$i],$num+1,$heap);
  23.  $output .= "</td></tr>n";
  24. }
  25.  }
  26.  
  27.  else { 
  28. $output .= '<tr><td> '.$list[$i].'</td><td align="right" width="80">'.MyFileSize($dir.$list[$i])."</td></tr>n"; }
  29. }
  30. $output .= '</table>';
  31. return $output;
  32.  }
  33. ?>

wywoluje ja tak:
  1. <?php
  2. echo DirTree('',0,''); // Jesli chce zaczac od katalogu glownego
  3. ?>

Funkcje SetTabulator MyFileSize SortList maja charakter czysto kosmetyczny, mozna je wywalic.
Po drobnych przerobkach powinno hulac rowniez u ciebie smile.gif
To dziala tylko pod php5
Setesh
A patrzyłeś jakie prawa mają te "pliki" ?

Nie bawię się w linuxie za bardzo ale wszystkie pliki w linuxie mogą być folderami - zależy od odpowiednich praw

oczywiście mogę się mylić ale to tak na pierwszy rzut oka mi się zaczeło wydawać smile.gif
wilman
localhosta mam na Windowsie
Wave
  1. <? 
  2. if( empty( $_GET['sciezka'] ) ) $_GET['sciezka'] = './';
  3. $folder = htmlspecialchars( nl2br( strip_tags( $_GET['sciezka'] ) ) );
  4.  
  5. echo 'Znajdujesz się w <b>' . $folder . '</b><br /><a href="java script:history.go(-1)">[wróć]</a><br />';
  6. $dir = dir($folder);
  7. $l = $d = array();
  8. while( $file = $dir->read() )
  9. {
  10. if( is_dir( $folder . $file ) )
  11. {
  12. if( $file != '.' && $file != '..' )
  13. $d[] = '[ <a href="?sciezka=' . $folder . $file . '/">' . $file . '</a> ]';
  14. }
  15. else $l[] = '<a href="' . $folder . $file . '">' . $file . '</a>'; 
  16. }
  17. $dir->close();
  18.  
  19. if( !empty( $d ) )
  20. {
  21. sort( $d );
  22. for( $i=0; $i<count($d); $i++ ) echo $d[$i] . "<br />rn";
  23. }
  24. if( !empty( $l ) )
  25. {
  26. sort( $l );
  27. for( $j=0; $j<count($l); $j++ ) echo $l[$j]."<br />rn";
  28. } else echo('Katalog jest pusty!');
  29. ?>
wilman
Dzieki wielkie, wszystko śmiga.
Pozdrawiam
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.