Автор Тема: Итериране на файлова система с РНР  (Прочетена 4210 пъти)

clovenhoof

  • Напреднали
  • *****
  • Публикации: 534
  • Distribution: Mac OSX 10.9.2
    • Профил
Няколко часа се блъскам и не мога да разбера защо следния код работи:

Код
GeSHi (PHP):
  1. <?php
  2.  
  3. $directory = '/tmp';
  4.  
  5. function iterateDir($dir)
  6. {
  7.      $iterator = new RecursiveDirectoryIterator($dir);
  8.       foreach (new RecursiveIteratorIterator($iterator, RecursiveIteratorIterator::CHILD_FIRST) as $file)
  9.       {
  10. //$file->isDot();
  11.            if($file->isDir())
  12.                echo $file->getPathname();
  13.            else
  14.                echo $file->getPathname();
  15.  
  16.            echo "<br>";
  17.      }
  18. }
  19.  
  20. iterateDir($directory);
  21. ?>
  22.  

но ако разкоментирам 10 ред, блокира на isDot().


Просто вече нямам нерви с това РНР :)


ПП: Всъщност искам да попълня една дървовидна контрола с имената на директории и файлове (dynatree).
« Последна редакция: May 18, 2013, 15:55 от clovenhoof »
Активен

We are just a moment in time
A blink of an eye
A dream for the blind
Visions from a dying brain

b2l

  • Напреднали
  • *****
  • Публикации: 4786
  • Distribution: MCC Interim
  • Window Manager: - // - // -
  • ...sometimes I feel like screaming... || RTFM!
    • Профил
    • WWW
Re: Итериране на файлова система с РНР
« Отговор #1 -: May 18, 2013, 16:57 »
Ти от тука ли гледа:
Код
GeSHi (PHP):
  1. <?php
  2. $directory = "/tmp/";
  3. $fileSPLObjects =  new RecursiveIteratorIterator(
  4.                new RecursiveDirectoryIterator($directory), RecursiveIteratorIterator::CHILD_FIRST);
  5. try {
  6.    foreach( $fileSPLObjects as $fullFileName => $fileSPLObject ) {
  7.        print $fullFileName . " " . $fileSPLObject->getFilename() . "\n";
  8.    }
  9. }
  10. catch (UnexpectedValueException $e) {
  11.    printf("Directory [%s] contained a directory we can not recurse into", $directory);
  12. }
  13. ?>
Активен

"Човекът е въже, опънато между звяра и свръхчовека, въже над пропаст. Човекът е нещо, което трябва да бъде превъзмогнато." - Фр. Ницше

clovenhoof

  • Напреднали
  • *****
  • Публикации: 534
  • Distribution: Mac OSX 10.9.2
    • Профил
Re: Итериране на файлова система с РНР
« Отговор #2 -: May 18, 2013, 17:20 »
Не. Беше функция за рекурсивно триене на файлове/директории.

На "твоя" код му сложих $fileSPLObject->isDot(); в цикъла и ефекта е пак същият. Просто спира генерирането на код. С view source от браузера страницата е непълна.

Всъщност вместо isDot(); вече ползвам:
Код
GeSHi (PHP):
  1.            $name = $file->getFilename();
  2.            if ($name == "." || $name == "..")
  3.                continue;
  4.  

ама не мога да разбера защо така блокира
« Последна редакция: May 18, 2013, 17:23 от clovenhoof »
Активен

We are just a moment in time
A blink of an eye
A dream for the blind
Visions from a dying brain

clovenhoof

  • Напреднали
  • *****
  • Публикации: 534
  • Distribution: Mac OSX 10.9.2
    • Профил
Re: Итериране на файлова система с РНР
« Отговор #3 -: May 18, 2013, 17:26 »
Абе, направо ако някой е ползвал tree control в рнр, нека покаже някакъв код за инициализирането.
Искам да я попълня с идеята както е в файлов менажер.

За tree control засега съм сложил dynatree.
Активен

We are just a moment in time
A blink of an eye
A dream for the blind
Visions from a dying brain

clovenhoof

  • Напреднали
  • *****
  • Публикации: 534
  • Distribution: Mac OSX 10.9.2
    • Профил
Re: Итериране на файлова система с РНР
« Отговор #4 -: May 18, 2013, 19:55 »
Ето как стана:

Код
GeSHi (PHP):
  1. <div id="tree">
  2.    <ul id="treeData" style="display: none;">
  3.  
  4. <?php
  5.  
  6. $dir = '/tmp';
  7.  
  8. function BuildTree($it)
  9. {
  10.    foreach ($it as $file)
  11.    {
  12.        $name = $file->getFilename();
  13.        if ($it->hasChildren())
  14.        {
  15.            echo "<li class='folder'>" . $name . "<ul>";
  16.            BuildTree($it->getChildren());
  17.            echo "</ul></li>";
  18.        }
  19.        else
  20.        {
  21.            echo "<li>" . $name . "</li>";
  22.        }
  23.    }
  24. };
  25.  
  26. $it = new RecursiveDirectoryIterator($dir, FilesystemIterator::SKIP_DOTS);
  27. BuildTree($it);
  28. ?>
  29.  
  30. </ul>
  31. </div>
  32.  

Горното е динамична инициализация на dynatree.
« Последна редакция: May 18, 2013, 22:37 от clovenhoof »
Активен

We are just a moment in time
A blink of an eye
A dream for the blind
Visions from a dying brain

b2l

  • Напреднали
  • *****
  • Публикации: 4786
  • Distribution: MCC Interim
  • Window Manager: - // - // -
  • ...sometimes I feel like screaming... || RTFM!
    • Профил
    • WWW
Re: Итериране на файлова система с РНР
« Отговор #5 -: May 18, 2013, 20:18 »
Код
GeSHi (PHP):
  1. <?php
  2.  
  3. $directory = '/tmp';
  4.  
  5. function iterateDir($dir)
  6. {
  7.      $iterator = new RecursiveDirectoryIterator($dir);
  8.       foreach (new RecursiveIteratorIterator($iterator, RecursiveIteratorIterator::CHILD_FIRST) as $file)
  9.       {
  10. //$file->isDot();
  11.            if($file->isDir())
  12.                echo $file->getPathname();
  13.            else
  14.                echo $file->getPathname();
  15.  
  16.            echo "<br>";
  17.      }
  18. }
  19.  
  20. iterateDir($directory);
  21. ?>
  22.  

Кода ти при мен работи. Провери ли си версията на php-то?
Активен

"Човекът е въже, опънато между звяра и свръхчовека, въже над пропаст. Човекът е нещо, което трябва да бъде превъзмогнато." - Фр. Ницше

neter

  • Global Moderator
  • Напреднали
  • *****
  • Публикации: 3408
  • Distribution: Debian, SailfishOS, CentOS
  • Window Manager: LXDE, Lipstick
    • Профил
    • WWW
Re: Итериране на файлова система с РНР
« Отговор #6 -: May 18, 2013, 21:20 »
но ако разкоментирам 10 ред, блокира на isDot().
Цък
Активен

"Да си добре приспособен към болно общество не е признак за добро здраве" - Джиду Кришнамурти

clovenhoof

  • Напреднали
  • *****
  • Публикации: 534
  • Distribution: Mac OSX 10.9.2
    • Профил
Re: Итериране на файлова система с РНР
« Отговор #7 -: May 18, 2013, 22:40 »
но ако разкоментирам 10 ред, блокира на isDot().
Цък

Ясно, мерси :)
В такъв случай е странно че работи при b2l.

Фикснах го по-горе.
Активен

We are just a moment in time
A blink of an eye
A dream for the blind
Visions from a dying brain

neter

  • Global Moderator
  • Напреднали
  • *****
  • Публикации: 3408
  • Distribution: Debian, SailfishOS, CentOS
  • Window Manager: LXDE, Lipstick
    • Профил
    • WWW
Re: Итериране на файлова система с РНР
« Отговор #8 -: May 18, 2013, 22:53 »
Предполагам, че b2l е забравил да разкоментира въпросния ред, когато го е изпълнявал :)
Активен

"Да си добре приспособен към болно общество не е признак за добро здраве" - Джиду Кришнамурти

b2l

  • Напреднали
  • *****
  • Публикации: 4786
  • Distribution: MCC Interim
  • Window Manager: - // - // -
  • ...sometimes I feel like screaming... || RTFM!
    • Профил
    • WWW
Re: Итериране на файлова система с РНР
« Отговор #9 -: May 19, 2013, 00:42 »
Предполагам, че b2l е забравил да разкоментира въпросния ред, когато го е изпълнявал :)

Не, просто го тествах на xampp (win-ския имам предвид).
Активен

"Човекът е въже, опънато между звяра и свръхчовека, въже над пропаст. Човекът е нещо, което трябва да бъде превъзмогнато." - Фр. Ницше

clovenhoof

  • Напреднали
  • *****
  • Публикации: 534
  • Distribution: Mac OSX 10.9.2
    • Профил
Re: Итериране на файлова система с РНР
« Отговор #10 -: May 23, 2013, 19:33 »
Нищо няма да питам само продължавам бележките си по вграждане на dyntree в GetSimple CMS.
Прочетох малко от документацията и реших да ползвам JSON/AJAX варианта за работа на контролата, а не с чист html чрез <ul> <li>. Може би основната причина е че искам да ползвам LazyLoad защото файловете в дървото ще са над 3500.

Няма да ползвам DB, а xml файл за зареждане на информацията за инициализиране/разширяване на дървото.

Първата стъпка е генерирането на xml файла:
Код
GeSHi (PHP):
  1. <?php
  2.  
  3. function BuildTree($it, &$dom_ref, &$root_node_ref)
  4. {
  5.    global $key;
  6.  
  7.    foreach ($it as $file)
  8.    {
  9.        $key += 1;
  10.        $node = $dom_ref->createElement("item");
  11.        $node->setAttribute('title', $file->getFilename());
  12.        $node->setAttribute('key', $key);
  13.  
  14.        if ($it->hasChildren())
  15.        {
  16.            BuildTree($it->getChildren(), $dom_ref, $node);
  17.        }
  18.  
  19.        $root_node_ref->appendChild($node);
  20.    }
  21. };
  22.  
  23. $dir = "/storage/ConvertedVideos";
  24. $key = 0;
  25.  
  26. $dom = new DomDocument();
  27. $dom->formatOutput = true;
  28.  
  29. $root = $dom->createElement("root");
  30. $root->setAttribute('title', basename($dir));
  31. $root->setAttribute('path', $dir);
  32. $dom->appendChild($root);
  33.  
  34. $it = new RecursiveDirectoryIterator($dir, FilesystemIterator::SKIP_DOTS);
  35. BuildTree($it, $dom, $root);
  36.  
  37. header("Content-type: text/xml");
  38. echo $dom->saveXML();
  39. ?>
  40.  
« Последна редакция: May 23, 2013, 19:35 от clovenhoof »
Активен

We are just a moment in time
A blink of an eye
A dream for the blind
Visions from a dying brain