Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> RecursiveDirectoryIterator, wyłaczanie wybranych katalogów
LBO
post
Post #1





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

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


  1. <?php
  2. foreach ($this->_includeDirectories as $directory) {
  3. $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory));
  4. foreach ($iterator as $file) {
  5. // tutaj, sprawdzenie, czy $file jest niechcianym
  6.  // folderem i pominięcie plików i folderów się w nim znajdujących
  7. }
  8. }
  9. ?>


Czy można w trakcie iteracji po tym obiekcie, wyłączać wskazane foldery?

edit:

chodzi mi o jakieś proste rozwiązanie. Bo mogę robić if'a porównującego niechciane ścieżki/niechciane nazwy folderów/etc z aktualnym $file->getPathname()

Ten post edytował LBO 16.11.2007, 15:34:20
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
matix
post
Post #2





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

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


Polecam FilterIterator (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

Stwórz sobie klasę, która będzie dziedziczyła FilterIterator.
W tej klasie stwórz metode accept() i tam możesz pousuwać odpowiednie katalogi/pliki których nie chcesz w spisie.

Pozdrawiam.
Go to the top of the page
+Quote Post
LBO
post
Post #3





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

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


Ale iteracja i tak się wykona po plikach i folderach z niechcianej ścieżki, a po co?

Zastanawiam się jak to zrobić metodami dostępnymi w tych iteratorach, ale żadko korzystałem z SPL i teraz mam problem.

Coś takiego:
  1. <?php
  2. $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory), RecursiveIteratorIterator::SELF_FIRST);
  3. foreach ($iterator as $file) {
  4. /* @var $file SplFileInfo */
  5. if ($file->isDir() || in_array($file->getPathname(), $excludedDirectories) {
  6. // tutaj zrobić coś ze zmienną $iterator, żeby skoczyła
  7. // do następnego folderu, a nie zagłębiała się w obecny
  8. } else {
  9.  // code
  10. }
  11. }
  12. ?>


Udało się (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Za wszystko odpowiada zagnieżdżony RecursiveDirectoryIterator:
  1. <?php
  2. $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory), RecursiveIteratorIterator::SELF_FIRST);
  3. foreach ($iterator as $file) {
  4. /* @var $file SplFileInfo */
  5. if ($file->isDir() && in_array($file->getPathname(), $excludedDirectories) {
  6. $rdi = $iterator->getInnerIterator(); // zwraca RecursiveDirectoryIterator przetwarzający właśnie dany folder
  7. /* @var $rdi RecursiveDirectoryIterator */
  8. $rdi->next(); // przesuwamy się dalej, ignorując niechciany folder
  9. }
  10. }
  11. }
  12. ?>


Ten post edytował LBO 16.11.2007, 16:51:31
Go to the top of the page
+Quote Post
Cysiaczek
post
Post #4





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




Jak tak własnie robiłem - sprawdzałem jeszcze isDot().
Teraz polecałbym jednak filterIterator.

Pozdrawiam.
Go to the top of the page
+Quote Post
LBO
post
Post #5





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

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


Problem już rozwiązany. Jak wspomniałem filtry same w sobie nie powodują wyłączenia z iteracji danego elementu. I tak bym musiał to oprogramować. A ponieważ nie potrzebuję takiego "zaawansowanego" narzędzia - wolałem to zrobić ręcznie.

edit:

A jednak, wyskoczył Bug :/

  1. <?php
  2. foreach ($iterator as $file) {
  3. /* @var $file SplFileInfo */
  4. if (in_array($file->getPathname(), $this->_excludePathes)) {
  5. $rdi = clone $iterator->getInnerIterator();
  6. /* @var $rdi RecursiveDirectoryIterator */
  7. $rdi->next();
  8. } else {
  9. print $file->getPathname() . '<br />' . PHP_EOL;
  10. }
  11. }
  12. ?>


niby działa i gdy trafi na folder umieszczony w tablicy $this->_excludePathes, to go pomija -- NIBY. Ale w czasie testów wyszło, że jeżeli w tym samym folderze znajduje się plik o takiej samej nazwie (oczywiście piszę o tym, co się znajduje przed rozszerzeniem) to wyrzuca wyjątek:
Cytat
Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(E:\localhost\www\test\folder1.txt) [<a href='http://www.php.net/manual/pl/function.RecursiveDirectoryIterator---construct'>function.RecursiveDirectoryIterator---construct</a>]: failed to open dir: Invalid argument' in E:\localhost\libraries\Headshot\Loader\Generator.php:53 Stack trace: #0 [internal function]: RecursiveDirectoryIterator->__construct('E:\localhost\ww...') #1 E:\localhost\libraries\Headshot\Loader\Generator.php(53): RecursiveDirectoryIterator->getChildren() #2 E:\localhost\www\generator_test.php(17): Headshot_Loader_Generator->generate() #3 {main} thrown in E:\localhost\libraries\Headshot\Loader\Generator.php on line 53


Wykrzaczył się na pliku E:\localhost\www\test\folder1.txt w momencie, gdy trafił na folder do pominięcia E:\localhost\www\test\folder1

edit:

Czyli nie da się tego zrobić bez filtrów?

Ten post edytował LBO 16.11.2007, 21:37:06
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 Aktualny czas: 20.12.2025 - 15:26