Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php]Drzewo katalogów & plików
b_chmura
post 21.10.2007, 14:46:26
Post #1





Grupa: Zarejestrowani
Postów: 813
Pomógł: 34
Dołączył: 18.03.2007
Skąd: o stamtąd

Ostrzeżenie: (0%)
-----


Witam
Za własną potrzebą postanowiłem napisać kod który wyświetli mi wszystkie pliki i katalogi:
  1. <?php
  2. function all_dir($katalog = './') 
  3. {
  4. $dir = opendir($katalog);
  5.  
  6. chdir($katalog);
  7.  
  8. while (false !== ($file = readdir($dir)))
  9. {
  10. if ($file != "." && $file != "..")
  11. {
  12. if (is_dir($file))
  13. {
  14. all_dir($file);
  15. echo "<b>$file</b><br />\n";
  16. } 
  17. else 
  18. {
  19. echo "$file<br />\n";
  20. }
  21. }
  22. }
  23.  
  24. chdir("../");
  25. }
  26. ?>


Funkcja spełnia swoje zadanie ale wyświetla wszystko jak leci w nieuporządkowanej kolejności.
Jak zmodyfikować kod aby działa coś w sposób drzewka tj.
Sortuje Katalogi i pliku (pierwsze są katalogi następnie pliki) jeśli w katalogu są inne katalogi i pliki robi to samo ale np o jeden tabulator do przodu.

Przykład:
Kod
-Katalog1
---plik1
---plik2
-Katalog2
---Katalog2.1
------plik1
------plik2
---Katalog2.2
------Katalog2.2.1
---------plik1
------Katalog2.2.2
------Katalog2.2.3
---------plik1
---Katalog2.3
-Katalog3
-plik1
-plik2
-plik3


byłbym wielce wdzięczny za pomoc

pozdrawiam
Chmura
Go to the top of the page
+Quote Post
Darti
post 21.10.2007, 15:09:22
Post #2





Grupa: Zarejestrowani
Postów: 1 076
Pomógł: 62
Dołączył: 6.03.2005
Skąd: Wroc

Ostrzeżenie: (0%)
-----


Skoro sam to napisałeś to powinieneś poradzić sobie z przerobieniem readdir() na scandir()


--------------------
The answer is out there, Neo. It's looking for you. And it will find you, if you want it to.
SERVER_SOFTWARE : Apache/2.2.4 (Win32) PHP/5.2.1
MySQL Client API version : 5.0.27
Go to the top of the page
+Quote Post
b_chmura
post 21.10.2007, 15:55:11
Post #3





Grupa: Zarejestrowani
Postów: 813
Pomógł: 34
Dołączył: 18.03.2007
Skąd: o stamtąd

Ostrzeżenie: (0%)
-----


Gitara, jak na moje jest pierwsza klasa. Dzięki za pomoc.
  1. <?php
  2. function all_dir($katalog = './')
  3. {
  4. $dir = scandir($katalog);
  5.  
  6. chdir($katalog);
  7.  
  8. echo '<ul>';
  9.  
  10. foreach($dir as $file)
  11. {
  12. if($file != '.' AND $file != '..')
  13. {
  14. if(is_dir($file))
  15. {
  16. echo "<li><b>$file</b></li>\n";
  17. all_dir($file);
  18. }
  19. else
  20. {
  21. echo "<li>$file</li>\n";
  22. }
  23. }
  24. }
  25.  
  26. echo '</ul>';
  27.  
  28. chdir('../');
  29. }
  30. ?>


PS. Ja zastosowałem <lu><li></li></lu> bo nie potrafiłem inaczej "tabulować" jest jakieś inne rozwiązanie?
Go to the top of the page
+Quote Post
Moli
post 21.10.2007, 16:08:32
Post #4





Grupa: Zarejestrowani
Postów: 662
Pomógł: 45
Dołączył: 26.03.2007
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Po 1 to nie jest pierwsza klasa smile.gif Po 2 mogłeś dać np. &nbsp;, ale po co, w <li><ul> jest to dobrze zrobione smile.gif
Go to the top of the page
+Quote Post
b_chmura
post 21.10.2007, 16:15:42
Post #5





Grupa: Zarejestrowani
Postów: 813
Pomógł: 34
Dołączył: 18.03.2007
Skąd: o stamtąd

Ostrzeżenie: (0%)
-----


czemu nie jest pierwsza klasa?

nie mogłem dać &nbsp; ponieważ dziwne rzeczy się robią, nie mam głowy żeby to opisać, śmiało możesz sprawdzić
chociaż w skrócie robią się takie złe rzeczy ze pliki/katalogi w tym samym katalogu także co &nbsp; są przesuwane.

Edit
Przepraszam, tak sie daje jeśli robie:
  1. <?php
  2. foreach(..)
  3. {
  4. $r .= '&nbsp;';
  5.  //..
  6. echo $r.'<b>'.$file.'</b>';
  7. }
  8. ?>

w/w przypadku wszystko jest po prostu przesunięte o spacje smile.gif

Ten post edytował b_chmura 21.10.2007, 16:19:38
Go to the top of the page
+Quote Post
matix
post 21.10.2007, 16:34:20
Post #6





Grupa: Zarejestrowani
Postów: 278
Pomógł: 10
Dołączył: 13.02.2007
Skąd: Rybnik

Ostrzeżenie: (0%)
-----


Skoro jesteśmy w takim fajnym temcie, to może ja przedstawię moją klasę do obslugi drzewek katalogów + cachuje do pliku zserializowaną tablicę, do użycia przy __autoload().

  1. <?php
  2. class core {
  3. const 
  4. temp = 'temp.tmp';
  5. private static
  6. $oInstance;
  7. public function singleton()
  8. {
  9. if (self::$oInstance == '')
  10. self::$oInstance = new self;
  11. return self::$oInstance;
  12. }
  13.  
  14. public function scan($sWhat)
  15. {
  16. $aDir = scandir($sWhat, 0);
  17. $aFiles = array();
  18.  
  19. foreach ($aDir as $sFile)
  20. {
  21. if ($sFile != '.') {
  22. if ($sFile != '..')
  23. {
  24.  
  25. if (is_dir($sWhat.$sFile))
  26.  $aFiles [$sFile] = $this->scan($sWhat.$sFile.'/');
  27.  else {
  28.  preg_match('#(.+).php#imU', $sFile, $sFileName);
  29.  $aFiles [$sFileName[1]] = $sWhat.$sFile;
  30. }
  31. }
  32.  }
  33. }
  34. foreach ($aFiles as $sName => $aDirs)
  35. {
  36.  if (is_array($aDirs))
  37. {
  38. foreach ($aDirs as $sName => $sFile)
  39. $_aFile [$sName] = $sFile;
  40.  
  41. }else{
  42.  $_aFile [$sName] = $aDirs;
  43.  }
  44. }
  45.  
  46.  
  47. return $_aFile;
  48. }
  49.  
  50. public function set()
  51. {
  52. $oConfig = config::singleton();
  53. $aFiles = serialize($this->scan($oConfig[dirs][core]));
  54.  
  55. file_put_contents($oConfig[dirs][core].self::temp, $aFiles);
  56. }
  57. public function get($sName)
  58. {
  59.  $oConfig = config::singleton();
  60.  if(is_file($oConfig[dirs][core].self::temp))
  61.  {
  62. $aFiles = unserialize(file_get_contents($oConfig[dirs][core].self::temp));
  63. if ($aFiles[$sName] == '')
  64. {
  65. $this->set();
  66. $aFiles = unserialize(file_get_contents($oConfig[dirs][core].self::temp));
  67.  
  68. if ($aFiles[$sName] == '')
  69.  throw new exception ('There is no '.$sName.' File in Our Repository!');
  70. else
  71.  $this->get($sName);
  72.  
  73. }else{
  74. include($aFiles[$sName]);
  75. return true;
  76. }
  77.  
  78.  }else{
  79. $this->set();
  80.  }
  81.  
  82.  return false;
  83. }
  84. }
  85. ?>


--------------------
Nawet, jeżeli nie jesteś zainteresowany usługami IT ani outsourcingiem, a Twoją pasją jest programowanie - zobacz naszą stronę. Piszemy dużo fajnych use-caseów, jak podchodzimy do tematu programowania dla naszych klientów. A tak na co dzień tworzymy budujemy mvp oraz tworzymy platformę b2b.
Go to the top of the page
+Quote Post
phpion
post 21.10.2007, 16:49:37
Post #7





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




@b_chmura
Wg mnie Twoja funkcja posiada jedną znaczącą wadę: nie zwraca danych, a je od razu wypisuje na ekran. Funkcja ta powinna raczej zwrócić tablicę zawierającą wszystkie elementy z danego katalogu; każdy katalog powinien posiadać tablicę plików w nim się znajdujących. Ponadto dobrze by było najpierw zapisywać w tablicy katalogi (posortowane), a po nich pliki (również posortowane), a nie wszystko na raz.

@matix
Z wcięciami to ładnie pojechałeś biggrin.gif
Go to the top of the page
+Quote Post
b_chmura
post 21.10.2007, 16:57:33
Post #8





Grupa: Zarejestrowani
Postów: 813
Pomógł: 34
Dołączył: 18.03.2007
Skąd: o stamtąd

Ostrzeżenie: (0%)
-----


Cytat(phpion.com @ 21.10.2007, 17:49:37 ) *
@b_chmura
Wg mnie Twoja funkcja posiada jedną znaczącą wadę: nie zwraca danych, a je od razu wypisuje na ekran. Funkcja ta powinna raczej zwrócić tablicę zawierającą wszystkie elementy z danego katalogu; każdy katalog powinien posiadać tablicę plików w nim się znajdujących. Ponadto dobrze by było najpierw zapisywać w tablicy katalogi (posortowane), a po nich pliki (również posortowane), a nie wszystko na raz.


czasem samo scandir() nie działa w ten sposób?

w zamiarze miałem wyświetlić wszystko, jednak mógłbyś przybliżyć mi swój pomysł?


@matix - ja i klasy... nie rozumiem tego:D
Go to the top of the page
+Quote Post
phpion
post 21.10.2007, 17:12:00
Post #9





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Cytat(b_chmura @ 21.10.2007, 17:57:33 ) *
czasem samo scandir() nie działa w ten sposób?

No właśnie sęk w tym, że nie. Wyświetla wszystko za jednym zamachem (i pliki i katalogi).
Go to the top of the page
+Quote Post
b_chmura
post 22.10.2007, 23:26:03
Post #10





Grupa: Zarejestrowani
Postów: 813
Pomógł: 34
Dołączył: 18.03.2007
Skąd: o stamtąd

Ostrzeżenie: (0%)
-----


Cytat
No właśnie sęk w tym, że nie. Wyświetla wszystko za jednym zamachem (i pliki i katalogi).


Już jest:
  1. <?php
  2. function sort_scandir($in, $chdir = 0)
  3. { 
  4. $sd = scandir($in);
  5.  
  6. if($chdir == 1){chdir($in);}
  7.  
  8. foreach($sd as $file)
  9. {
  10. if(is_dir($file))
  11. {
  12. $ARRfile['1'][] = $file;
  13.  
  14. }
  15. if(is_file($file))
  16. {
  17. $ARRfile['2'][] = $file;
  18. }
  19. }
  20. foreach($ARRfile as $file)
  21. {
  22. foreach($file as $file)
  23. {
  24. $out[] = $file;
  25. }
  26. }
  27. return $out;
  28. }
  29. ?>


$chdir jest na potrzeby własne

Mam do was małą prośbę, nie potrafię sobie poradzić z unikalnym ID. Na razie robię to w dość nie przyzwoity sposób a zależałoby mi by wyglądało to mniej więcej w ten sposób:
pierwsze katalogi są numerowane od 1 wzwyż podrzędne odziedziczają numer po nadrzędnym katalogu + są także numerowane od jeden wzwyż i tak aż do ostatniego katalogu. Byłby ktoś wstanie wskazać mi jak to zrobić? ja naprawdę próbowałem już wszystkiego (dwie godziny nie moje)
Przykład:

Kod
- katalog 1
- katalog 2
---- katalog 2.1
---- katalog 2.2
---- katalog 2.3
-------- katalog 2.3.1
itd


Dotychczasowy kod:
  1. <?php
  2. function all_dir($katalog = './', $cat = '', $st = '')
  3. {
  4. $dir = sort_scandir($katalog, 1);
  5. $cat .= $katalog.'/';
  6.  
  7.  
  8. foreach($dir as $file)
  9. {
  10. $id  = rand(0, 999).count($dir).$i++.$cnt;
  11. if($file != '.' AND $file != '..' AND $file != '.htaccess')
  12. {
  13. if(is_dir($file))
  14. { 
  15. echo '<div class="file">- ['.$id.']<b>'.$file.'</b> <a onClick="javascript: ShowHide('dir_'.$id.'''button_'.$id.'');" id="button_'.$id.'">+</a><span style="display: none;" id="dir_'.$id.'">'."\n";
  16. all_dir($file, $cat);
  17. echo '</span></div>';
  18. $cnt++;
  19. }
  20. else
  21. {
  22. $size = round(filesize($file)/1024);
  23. $all_size += $size;
  24. echo '<div class="file">- <a href="'.$cat.$file.'">'.$file.'</a> <span id="filesize">('.$size.' Kb)</span></div>'."\n";
  25. }
  26. }
  27. }
  28. chdir('../');
  29. return $all_size;
  30. }
  31. ?>


i na sam koniec mi sie przypomniało, nie mogę sobie również poradzić z polskimi znakami w url'u (pokazują mi sie znaki zapytania)
próbowałem użyć urlencode ale kod sie dziwnie zachowuje i tak jakby nie widział tej funkcji (nie reaguje na nią...)


Pozdrawiam


EDIT:
Przykład działania: http://www.informel.pl/~bchmura/cos.php

EDIT:
Te cyferki to numer ID

Ten post edytował b_chmura 22.10.2007, 23:41:24
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 25.04.2025 - 05:38