Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: RecursiveDirectoryIterator, wyłaczanie wybranych katalogów
Forum PHP.pl > Forum > PHP
LBO
  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()
matix
Polecam FilterIterator 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.
LBO
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ę 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. ?>
Cysiaczek
Jak tak własnie robiłem - sprawdzałem jeszcze isDot().
Teraz polecałbym jednak filterIterator.

Pozdrawiam.
LBO
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?
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.