verzeichnis aus alias auslesen funktioniert nicht mir scandir()

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

  • verzeichnis aus alias auslesen funktioniert nicht mir scandir()

    Hallo zusammen,

    nach längerer Zeit habe ich mal wieder ein kleines Problem, bei dem ich eure Hilfe benötige. Installiert ist xampp mit php7.3.12 und Apache 2.4.41. Der Server wird nur lokal betrieben.

    Ich bin dabei mir eine Bilddatenbank meiner Bilder zu erstellen.
    Da das mittlerweile eine größere Anzahl ist, sind die einzelenen Verzeichnisse auf einer externen Festplatte in einem Sammelverzeichnis ausgelagert.
    Die Struktur ist wie folgt aufgebaut und es wird auch nicht tiefer geschachtelt.
    -- Bilder
    |- Ordner 1
    |- Ordner 2
    |- Ordner 3
    |--- Ordner 3.1
    |--- Ordner 3.2

    Um die externe Festplatte ansprechen zu können habe ich einen Alias erstellt.
    wenn ich diesen im Browser anspreche werden auch alle Verzeichnisse angezeigt. Soweit so gut, der Alias funktioniert also. Zumindest für den Browser.

    Mein Problem ist nun, das scandir() nicht funktioniert wenn ich auf aus dem Alias auslesen will. Folgend der Code dazu.
    Seltsamerweise funktioniert es aber wenn das Verzeichnis 'bilder' im htdocs-Verzeichnis des xampp liegt ?!

    PHP-Code:
    #Unterverzeichnisse aus Alben-Ordner auslesen
    $alledateien scandir('bilder'); // 

    #Array mit Verzeichnissen erstellen
    foreach ($alledateien as $datei)

        if (
    $datei != "." && $datei != ".."
        {
            
    $dirs[] = $datei//Verzeichnisse in Array schreiben
        
    }

    Folgende Fehlermeldungen kommen beim Versuch vom Alias einzulesen:
    Warning: scandir(bilder,bilder): Das System kann die angegebene Datei nicht finden. (code: 2)
    Warning: scandir(bilder): failed to open dir: No such file or directory
    Warning: scandir(): (errno 2): No such file or directory

    Was mir auffällt, ist das in der ersten Meldung zweimal der Alias genannt wird. Warum das so ist kann ich leider nicht sagen.
    Weitere Vermutung ist, dass das mit scandir() aus einen Alias gar nicht geht, sondern über opendir(), readdir() und closedir() gemacht werden muss.



    Kann mir jemand hier bitte weiterhelfen ?!?!


    Meine Theorie mit opendir usw. stimmt leider auch nicht. Auf diesem Wege erhalte ich die gleichen Fehlermeldungen.
    PHP-Code:
    if ($handle opendir('bilder')) {
        echo 
    "Verzeichnis-Handle: $handle\n";
        echo 
    "Einträge:\n";

        
    /* Das ist der korrekte Weg, ein Verzeichnis zu durchlaufen. */
        
    while (false !== ($entry readdir($handle))) {
            echo 
    "$entry\n";
        }

        
    closedir($handle);

    Zuletzt geändert von fritzje610; 06.01.2020, 09:56.
    Gruß

    Michael

  • #2
    Da Du ohnehin mit PHP 7.3 arbeitest, könntest Du Dir auch die entsprechenden Iterator Klassen dazu mal ansehen. Mittels der PHP eigenen Klasse RecursiveDirectoryIterator und der RecursiveCallbackFilterIterator Klasse könnte es eventuell funktionieren. Du kannst mittels der FileSystemIterator Klasse festlegen, dass auch Symlinks gefolgt werden soll.

    Als Basis hierfür müsstest einen Symlink (Alias) in dem Verzeichnis ablegen, in dem Dein PHP Skript ausgeführt wird. Der initialisierte Iterator folgt dann den Verzeichnissen, liest alle Inhalte dieser Vezeichnisse aus und erzeugt zu jeder Datei und zu jedem relevaten Verzeichnis ein SplFileInfo Objekt.

    Der CallbackFilter ist notwendig, um den technischen Aufwand so gering wie möglich zu halten. Du kannst mit dem Filter festlegen, dass Du Bilddateien und die relevanten Verzeichnisse ausgelesen werden. Du könntest im Filter ebenfalls definieren, welche Verzeichnisse nicht ausgelesen werden sollen.

    PHP-Code:
    $directory = new \RecursiveDirectoryIterator('bilder', \FilesystemIterator::FOLLOW_SYMLINKS);
    $filter = new \RecursiveCallbackFilterIterator($directory, function($current$key$iterator) {
        
    // Versteckte Dateien und Verzeichnisse nicht beachten
        
    if ($current->getFilename()[0] === '.') {
            return 
    FALSE;
        }
      
        
    // relevante Unterverzeichnisse beachten
        
    if ($current->isDir()) {
            return 
    true;
        } 

        
    // relevante Dateien beachten
        
    else {
            return 
    in_array($current->getExtension(), [ 'jpg''png' ]);
        }
    });

    $files = array();
    $iterator = new \RecursiveIteratorIterator($filter);

    foreach (
    $iterator as $info) {
        
    $files[] = $info->getPathname();

    Da Du von einer relativ großen Menge an Dateien und Verzeichnissen gesprochen hast, macht es eventuell Sinn die Dateien über ein yield() zu prozessieren, um den Speicherverbrauch so gering wie möglich zu halten.

    Ich hoffe Du kannst mit diesem doch eher objektorientiertem Ansatz etwas anfangen. Bei Fragen einfach fragen.
    MM Newmedia | MeinBlog

    Kommentar


    • #3
      Hallo zusammen,

      erstmal vielen Dank an ezkimo für den objektorientierten Ansatz.
      Aber da kenn ich mich überhaupt noch nicht aus. Mache noch alles prozedural.

      Für das einlesen habe ich jetzt eine Lösung gefunden, bei der ich sogar den Alias nicht bräuchte. Man muss den absoluten Pfad des Filesystems nutzen. Anstatt:
      PHP-Code:
      #Unterverzeichnisse aus Alben-Ordner auslesen
      $alledateien scandir('bilder'); 
      PHP-Code:
      #Unterverzeichnisse aus Alben-Ordner auslesen
      $alledateien scandir('LW:\Pfad\'); 
      Allerdings habe ich jetzt das Problem, das die Bilder beim anzeigen nicht mehr angezeigt werden Anstatt des Bildes wird ein weißer Platzhalter angezeigt. Weder der absolute Pfad zum Bild
      HTML-Code:
      <img src=h:\\bilder\\" . $row['verzeichnis'] . "\\" . $row['dateiname'] . " width='200' height='150'></img>
      Noch der über den Alias funktionieren
      HTML-Code:
      <img src=bilder/" . $row['verzeichnis'] . "/" . $row['dateiname'] . " width='200' height='150'></img>
      Hat jemand ne Idee wie ich meine Bilder wieder zur Anzeige bringen kann ? ? ?
      Gruß

      Michael

      Kommentar


      • #4
        Hallo,

        Fehler gefunden, läuft alles.
        Man muss natürlich auch im img-Tag die Anführungszeichen richtig setzen.

        Danke an alle ! ! ! !
        Gruß

        Michael

        Kommentar

        Lädt...
        X