Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Dateien ausgeben

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Dateien ausgeben

    Hallo, ich versuchte mittels RecursiveDirectoryIterator alle Dateien auszugeben, die auf Controller.php enden (z.B. HomeController.php, ViewController.php, ...), und unterhalb des Verzeichnisses "MyDirectory" liegen. Hier meine kläglichen Versuche. Leider gibt es auf php.net keine gescheihte Doku, weshalb ich feststecke. Ich hab aber etwas von einem RegexIterator gehört, der prüfen könnte, ob am Ende der jeweilige Suchstring vorkommt.

    PHP-Code:
    <?php
    $directory
    =new RecursiveDirectoryIterator(__DIR__ "../MyDirectory");

    foreach (new 
    RecursiveIteratorIterator($directory) as $filename) {

        echo 
    "$filename";
    }
    ?>


  • #2
    Hmm...., es ist spät, aber:

    edit: es ist zu spät, falls du die erste Version gesehen hast, ignoriere sie.
    PHP-Code:
    foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)) as $fullFileName => $fifo) {
        if(!
    $fifo->isFile() || !fnmatch('*Controller.php'$fifo->getBaseName())) {
            continue;
        }
        echo 
    $fullFileNamePHP_EOL;

    Sauberer vermutlich mit einem eigenen FilterIterator oder RegexIterator:

    http://php.net/manual/en/class.filteriterator.php
    http://php.net/manual/en/class.recur...tor.php#114504
    http://php.net/manual/en/class.recur...ator.php#97228
    Zitat von nikosch
    Naja, anscheinend spricht die Steckdose kein HTTP. LOL

    Kommentar


    • #3
      Ja, RegexIterator wäre top.

      Nachtrag: Eines hab ich noch vergessen. Ich muss alle Dateien rausfinden, die auf *Controller.php enden, und im Ordner Controllers liegen. Es gibt in der App mehrere Ordner Controllers, allerdings sollen nur die Dateien von diesen genommen werden, und nich Dateien, die nicht im Ordner Controllers liegen. Also nochmal gesamt. Es wird ein Pfad $path angegeben, unterhalb von diesem wird nach Ordnern Controllern gesucht, und von diesen werden alle Dateien, die auf *Controller.php enden ausgegeben. Sorry für den Nachtrag

      Kommentar


      • #4
        Jemand noch ne Idee?

        Kommentar


        • #5
          Wie gesagt, wäre unter Umständen vermutlich vielseitiger, aber nicht wirklich notwendig.

          Wenn du mit Kanonen auf Spatzen schießen möchtest: (ansonsten passe einfach das Beispiel aus meinem ersten Post an deine Bedingungen an, ist nicht wirklich viel zu ändern (z.B.: fnmatch -> preg_match).

          PHP-Code:
          <?php
          // untested

          class PathFilterIterator extends FilterIterator
          {
              private 
          $pathFilter;
             
              public function 
          __construct(Iterator $iterator, callable $filter )
              {
                  
          parent::__construct($iterator);
                  
          $this->pathFilter $filter;
              }
             
              public function 
          accept()
              {
                  
          $item $this->getInnerIterator()->current();
                  if(
          $this->pathFilter->__invoke($item) !== true) {
                      return 
          false;
                  }
                  return 
          true;
              }
          }


          $path __DIR__ '/../';

          $it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path));
          $filter = new PathFilterIterator($it, function(SplFileInfo $fifo) {
              return 
          $fifo->isFile() && preg_match('~\/Controllers\/.*Controller\.php$~'str_replace('\\''/'$fifo->getRealPath())) === 1
          });

          foreach (
          $filter as $fullFileName => $fifo) {
              echo 
          $fifo->getPathName(), PHP_EOL;
          }
          Zitat von nikosch
          Naja, anscheinend spricht die Steckdose kein HTTP. LOL

          Kommentar


          • #6
            Bitte auch Thread lesen. Er hat gesagt, dass er das mit nem RegexIterator lösen will/muss. http://php.net/manual/de/class.regexiterator.php

            Ansonsten denke ich, ohne dir Unrecht tun zu wollen, dass die Lösung zu viel des guten für ihn ist.

            Kommentar


            • #7
              Ich habe zwei Lösungsvorschläge gemacht, den ersten kann man ohne Probleme an seine neuen Anforderungen anpassen.

              Zum zweiten Vorschlag: Der RegexIterator ist eine Spezialisierung des FilterIterators (wie auch mein Vorschlag), aber wurde nicht direkt dafür geschaffen, mit SplFileInfo Objekten, die aus einem FilesystemIterator (oder einer Kindsklasse wie RecursiveDirectoryIterator) stammen umzugehen. Mit bestimmten Werten für den $flags parameter vom FilesystemIterator besteht die Gefahr das das ganze nicht mehr wie erwartet funktioniert od. Man müsste in jedem Fall einen zusätzlichen Filter verwenden, sich darauf verlassen, das die richtigen Flags gesetzt wurden oder würde statt SplFileInfo Objekten reine Pfade erhalten, die im Nachhinein auch eigens validiert werden müssten. Von wo man jetzt die Sache angeht ist denke ich zweitrangig.

              Ich hab aber etwas von einem RegexIterator gehört, der prüfen könnte, ob am Ende der jeweilige Suchstring vorkommt.
              Klingt nicht zwingend nach einer festen Anforderung.


              Wie dem auch sei, in den Nutzer-Kommentaren zu RecursiveDirectoryIterator gibt es eine Lösung mittels einem RegexIterator.

              Und mein zweiter Vorschlag in kurz für > PHP 5.4:

              PHP-Code:
              $path __DIR__ '/../';

              $directory = new RecursiveIteratorIterator(new \RecursiveDirectoryIterator($path));
              $filter = new \CallbackFilterIterator($directory, function($fifo) {
                  return 
              $fifo->isFile() && preg_match('~\/Controllers\/.*Controller\.php$~i'str_replace('\\''/'$fifo->getRealPath())) >= 1;
              });

              foreach(
              $filter as $item) {
                  echo 
              $item->getRealPath(), PHP_EOL;

              Zitat von nikosch
              Naja, anscheinend spricht die Steckdose kein HTTP. LOL

              Kommentar

              Lädt...
              X