Thread readdir -> Änderungen im Verzeichnis (12 answers)
Opened by Cappu at 2009-08-13 21:50

sid burn
 2009-08-13 23:40
#124222 #124222
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Okay, und nun zur Erklärung zur Ausgabe. Als erstes vorweg. Ich weiß es nicht 100%ig, allerdiengs ist das eine zusammenreimung von dem Wissen was ich besitze.

1) I/O generell passiert immer gepuffert. Wenn man eine Datei mit "my $line = <$fh>" z.B. liest dann wird in wirklich nicht nur eine Zeile eingelesen, sondern die stdio aus C Puffert ergebnisse zwischen. Daher in wirklichkeit werden bereits sagen wir 100 Zeilen gelesen, aber <$fh> gibt erstmal nur eine zurück. Erneurte aufrufe bedienen sich erstmal aus dem Puffer, wenn dieser aufgebraucht ist, erst dann wird wieder von der alten Position weiter gelesen.

2) readdir wird wahrschienlich genauso verfahren

3) Daher beim ersten lesen mit readdir $dh. Wird zwar ein eintrag zurück gegeben. readdir() bzw das OS puffert gleich weiter. Wenn man nur wenige Dateien zum Testen nimmt kann es dann resultieren das es so ausschaut als wenn alles gepuffert wird. Bei vielen Dateien trifft das aber nicht mehr zu.

4) Wichtig zu beachten ist, das bei einem Dateisystem die Datei von einem puren "readdir" unsortiert sind. das OS/Filesystem legt die dateien so an wie es das für optimal hält, und nicht alphabetisch etc. Daher kommen die Dateien unsortiert heraus. Man sieht das durcheinander ein paar Dateien noch vorhanden, der großteil der Dateien ist verschwunden. Aus meinen Beispiel sieht man das wohl knapp 168 Dateien gepuffert wurden (readdir.pl, . (punkt) und .. (punktpunkt) bleiben ja vorhanden daher kann ich nicht sagen ob diese im puffer liegen oder einfach später ausgelesen werden). Allerdiengs sollte sich die Puffergröße je nach OS/Dateisystem und sogar wahrschienlich RAM und wahrscheinlich dynamisch zur laufzeit ändern, mit einer festen anzahl würde ich also nicht rechnen.

5) Schlußfolgerung:
readdir() liest so wie es auch sein sollte die Daten itterrativ aus. Das OS puffert allerdiengs daten zwischen. Löscht du datein zwischendurch kann es sein das diese trotzdem noch angezeigt werden, weil sie im puffer liegen.

Wenn du die Datei schon durchlaufen bist, und der Itterrator ist schon darüüber hinweg hat es für dich keinerlei auswirkung.

Erzeugst du neue Dateien kann es hier ebenfalls sein, dass sie angezeigt werden, oder aber das sie nicht erscheinen, weil der puffer nämlich den itterrator soweit nach vorne geschoben hat, dass deine neue datei nicht mehr erfasst wird.


Getestet unter Debian Lenny, 32bit, ext3.
Last edited: 2009-08-13 23:51:09 +0200 (CEST)
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de

View full thread readdir -> Änderungen im Verzeichnis