Sven Rautenberg: Programmierfehler? Seltsames Problem mit readdir()

Beitrag lesen

Moin!

Die entscheidene Frage:
Wenn es aber ein Programmierfehler ist, warum funktioniert das Script so wie es ist aber nahezu überall?
Kann es irgendwie mit der Festplattengeschwindigkeit zusammenhängen?

Nein, es hängt (vermutlich - genau beweisen kann ich es nicht) mit der Directorystruktur zusammen.

Dein Skript öffnet das Verzeichnis, liest einen Dateinamen aus und generiert ein neues Bild.

Mit Pech erzeugt dieser Vorgang einen neuen Dateinamen, der sich genau _hinter_ den gerade ausgelesenen Dateinamen setzt, und dann als nächstes ausgelesen wird. So kommt es zur Endlosschleife.

Mit Glück passiert das nicht, d.h. das neue Thumbnail wird entweder weit danach oder auch vor den derzeitigen Verzeichniseintrag gesetzt. Sobald in einem Verzeichnis Dateien gelöscht sind, werden in der fortlaufenden Liste ja Plätze frei, die wieder neu genutzt werden können.

Dein Skript verstößt halt ganz einfach gegen eine elementare Grundregel, indem es die Liste (ein Verzeichnis kann man betrachten als eine Textdatei mit einer Liste von Dateien darin), mit der es arbeitet, währenddessen verändert. Und zwar dummerweise an Stellen, die du nicht vorhersehen kannst, weil du den Zustand des Verzeichnisses, insbesondere von Listenlücken, nicht kennst.

Deshalb arbeiten übliche Thumbnailskripte entweder so, dass sie zuerst die gesamte Dateiliste einlesen, und erst dann generieren, oder dass sie die Thumbnails in ein anderes Verzeichnis speichern (was den Vorteil hätte, dass ein zweiter Skriptlauf keine Thumbnails der Thumbnails erzeugt).

Wenn du von der Endlosschleife wegkommen willst, könntest du natürlich auch einfach prüfen, ob der gerade gelesene Dateiname das Thumbnail-Prefix (oder -Suffix) enthält, und in diesem Fall die Datei überspringen. Das würde die Endlosschleife unterbrechen und außerdem verhindern, dass auch bei mehreren Durchläufen Thumbnails von Thumbnails erzeugt werden.

- Sven Rautenberg

--
"Love your nation - respect the others."