Hallo,
So gesehen liefert stat doch falsche Informationen zu dem übergebenen Dateinamen?
Nein. dp->d_name enthält nur den Namen des Eintrages innerhalb des Verzeichnisses, nicht auch noch das Verzeichnis. Daher schlägt stat() bei allen Aufrufen fehl, außer die Datei existiert zufällig auch noch im aktuellen Verzeichnis, was nur bei '.' und '..' immer gegeben ist. Wenn stat() fehlschlägt (deswegen solltest Du Returncodes auch beachten!) ändert es den zweiten Parameter nicht und der enthält noch die alten Daten von vorher.
Du müsstest den Verzeichnisnamen, '/' und den Eintrag konkatenieren, bevor Du ihn stat() übergibst. Und natürlich wie gesagt den Returncode von stat() überprüfen und wenn der fehlschlägt den dazugehörigen Fehlercode beachten, indem Du #include <errno.h> einbindest und dann im Fehlerfall die globale Variable [1] errno abfragst.
[1] Genauer: Eigentlich ist das bei der glibc keine globale Variable sondern ein spezielles Makro was sich so verhält wie eine Variable (man kann errno etwas zuweisen und es auch auslesen), was aber für jeden Thread separat ist - damit ist das problemlos in mehreren Threads verwendbar.
Viele Grüße,
Christian
Mein "Weblog" [RSS]
Using XSLT to create JSON output (Saxon-B 9.0 for Java)
»I don't believe you can call yourself a web developer until you've built an app that uses hyperlinks for deletion and have all your data deleted by a search bot.«
-- Kommentar bei TDWTF