I/O

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: αν το σύστημα αρχείων έχει συμπιέσει ή αναδιοργανώσει τον κατάλογο μεταξύ των δύο κλήσεων (αρχεία που δημιουργήθηκαν, διαγράφηκαν, ή μετονομάστηκαν στον ίδιο κατάλογο από οποιαδήποτε διεργασία), το cookie POS ενδέχεται να μην αναφέρεται πλέον στην ίδια εγγραφή - ή σε καμία εγγραφή. Αυτή είναι ιδιότητα της υποκείμενης 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 - παράγει το cookie POS που καταναλώνει η seekdir· οι δύο είναι χρήσιμες μόνο ως ζεύγος

  • readdir - διαβάζει την επόμενη εγγραφή· συνεχίζει από τη θέση που μόλις έθεσε η seekdir

  • rewinddir - ο ιδιωματικός τρόπος για επιστροφή στην αρχή ενός καταλόγου· προτιμήστε την έναντι του seekdir $dh, 0

  • opendir - ανοίγει τον κατάλογο και αποκτά το handle στο οποίο λειτουργεί η seekdir

  • seek - το ανάλογο για file handle, αλλά με πραγματικό byte-offset και όρισμα whence· τα handles καταλόγου δεν έχουν ούτε το ένα ούτε το άλλο