PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr (https://www.php-resource.de/forum/)
-   PHP Developer Forum (https://www.php-resource.de/forum/php-developer-forum/)
-   -   verzeichnis aus alias auslesen funktioniert nicht mir scandir() (https://www.php-resource.de/forum/php-developer-forum/106856-verzeichnis-aus-alias-auslesen-funktioniert-nicht-mir-scandir.html)

fritzje610 06-01-2020 09:42

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);



ezkimo 06-01-2020 12:42

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. ;)

fritzje610 06-01-2020 13:44

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 :mad: 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 ? ? ?

fritzje610 08-01-2020 07:15

Hallo,

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

Danke an alle ! ! ! !


Alle Zeitangaben in WEZ +2. Es ist jetzt 10:25 Uhr.

Powered by vBulletin® Version 3.8.2 (Deutsch)
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.3.0
[c] ebiz-consult GmbH & Co. KG