seekdir#
Επαναφέρει ένα handle καταλόγου σε μια θέση που είχε προηγουμένως αποτυπωθεί από την telldir.
Η seekdir μετακινεί τον δρομέα ανάγνωσης του DIRHANDLE στο POS, ώστε η επόμενη κλήση readdir να επιστρέψει την εγγραφή που θα είχε επιστραφεί όταν το POS αποκτήθηκε για πρώτη φορά από την telldir στο ίδιο handle. Είναι το αντίστοιχο για κατάλογο της seek σε file handle - με τον κρίσιμο περιορισμό ότι το POS δεν είναι byte-offset που μπορείτε να υπολογίσετε, είναι ένα αδιαφανές cookie που πρέπει να έχετε λάβει νωρίτερα από την telldir.
Σύνοψη#
seekdir DIRHANDLE, POS
Τι επιστρέφεται#
Καμία ουσιαστική τιμή. Η seekdir επιστρέφει ό,τι επιστρέφει η υποκείμενη seekdir(3), το οποίο στο Linux δεν είναι τίποτα χρήσιμο - μην διακλαδώνετε με βάση την τιμή επιστροφής. Για να ανιχνεύσετε πρόβλημα, ελέγξτε το $! μετά την κλήση, ή επαληθεύστε ότι το handle είναι ακόμη ανοιχτό πριν την κλήση.
Τυπική χρήση#
Διασχίζετε έναν κατάλογο, παρατηρείτε μια εγγραφή που θέλετε να επανεπισκεφθείτε αργότερα, και θυμάστε πού βρισκόσασταν ώστε να μπορείτε να επιστρέψετε σε αυτή αφού συνεχίσετε την ανάγνωση:
opendir my $dh, $path or die "opendir $path: $!";
my %bookmarks;
while (my $entry = readdir $dh) {
$bookmarks{$entry} = telldir $dh # position AFTER reading $entry
if $entry =~ /\.conf\z/;
}
# later: re-read the entry that follows the first .conf file
seekdir $dh, $bookmarks{(sort keys %bookmarks)[0]};
my $next = readdir $dh;
closedir $dh;
Η επιστροφή στην αρχή είναι η συνηθισμένη ειδική περίπτωση - μια κλήση seekdir $dh, 0 είναι ισοδύναμη με την rewinddir σε συμμορφωμένα συστήματα, αλλά η rewinddir είναι η ιδιωματική γραφή για αυτή την πρόθεση:
seekdir $dh, 0; # works, but say what you mean:
rewinddir $dh; # clearer
Οριακές περιπτώσεις#
Το
POSπρέπει να προέρχεται από τηνtelldirστο ίδιο handle. Το πέρασμα ενός ακεραίου που επινοήσατε, μιας τιμής από διαφορετικό handle, ή μιας μπαγιάτικης τιμής από handle που έκτοτε έκλεισε και ξανά-ανοίχτηκε είναι απροσδιόριστη συμπεριφορά. Ο πυρήνας μπορεί να την αποδεχτεί σιωπηλά και να σας δώσει σκουπίδια στο επόμενοreaddir, να παραλείψει εγγραφές, ή να επιστρέψει διπλότυπα.Συμπίεση καταλόγου μεταξύ
telldirκαιseekdir: αν το σύστημα αρχείων έχει συμπιέσει ή αναδιοργανώσει τον κατάλογο μεταξύ των δύο κλήσεων (αρχεία που δημιουργήθηκαν, διαγράφηκαν, ή μετονομάστηκαν στον ίδιο κατάλογο από οποιαδήποτε διεργασία), το cookiePOSενδέχεται να μην αναφέρεται πλέον στην ίδια εγγραφή - ή σε καμία εγγραφή. Αυτή είναι ιδιότητα της υποκείμενηςseekdir(3)και όχι περιορισμός του pperl. Για σταθερή επανάληψη πάνω σε κατάλογο που αλλάζει, λάβετε στιγμιότυπο της λίστας μεreaddirσε περιβάλλον λίστας και δουλέψτε στο αντίγραφο.Μη ανοιγμένο ή κλειστό handle: θέτει το
$!. Υπόuse warningsλαμβάνετε την προειδοποίησηseekdir() attempted on invalid dirhandle. Τίποτα στην τιμή επιστροφής δεν σας λέει ότι αυτό συνέβη - ελέγξτε το$!ή χρησιμοποιήστεdefined fileno($dh)/ ρητή λογιστική αν χρειάζεστε να προστατευτείτε.Δεν είναι byte-offset: το
POSείναι αδιαφανές διακριτικό. Η αριθμητική πάνω σε αυτό (seekdir $dh, $pos + 1) δεν έχει νόημα· οι μόνες ασφαλείς τιμές είναι το0(αρχή καταλόγου, και ακόμη και τότε προτιμήστεrewinddir) και οι τιμές που επιστρέφονται από τηνtelldir.Η σειρά εγγραφών δεν είναι προδιαγεγραμμένη: η
seekdirαναπαράγει όποια σειρά επέστρεψε αρχικά ο πυρήνας. Αυτή η σειρά δεν είναι ταξινομημένη, ούτε αλφαβητική, και δεν εγγυάται ότι θα ταιριάξει με ένα φρέσκοopendirτης ίδιας διαδρομής αργότερα. Αν ο κώδικάς σας ταξινομεί, ταξινομείτε ρητά κάθε φορά.Σχετικές αναζητήσεις τύπου
SEEK_CURδεν υπάρχουν για handles καταλόγου. Δεν υπάρχει ισοδύναμο του ορίσματος whence τηςseek.
Διαφορές από το upstream#
Πλήρως συμβατό με το upstream Perl 5.42.
Δείτε επίσης#
telldir- παράγει το cookiePOSπου καταναλώνει ηseekdir· οι δύο είναι χρήσιμες μόνο ως ζεύγοςreaddir- διαβάζει την επόμενη εγγραφή· συνεχίζει από τη θέση που μόλις έθεσε ηseekdirrewinddir- ο ιδιωματικός τρόπος για επιστροφή στην αρχή ενός καταλόγου· προτιμήστε την έναντι τουseekdir $dh, 0opendir- ανοίγει τον κατάλογο και αποκτά το handle στο οποίο λειτουργεί ηseekdirseek- το ανάλογο για file handle, αλλά με πραγματικό byte-offset και όρισμαwhence· τα handles καταλόγου δεν έχουν ούτε το ένα ούτε το άλλο