I/O

telldir#

Επιστρέφει την τρέχουσα θέση ανάγνωσης ενός handle καταλόγου ως αδιαφανές διακριτικό.

Η telldir αναφέρει από πού θα ξεκινήσει η επόμενη readdir στο DIRHANDLE. Η επιστρεφόμενη τιμή είναι ένας σελιδοδείκτης, όχι byte-offset: παραδώστε την πίσω στη seekdir για να συνεχίσετε την επανάληψη στην ίδια εγγραφή, ή αγνοήστε την. Ο αριθμός δεν έχει αριθμητική σημασία - δεν είναι θέση μέσα στον κατάλογο, ούτε μετρητής εγγραφών που διαβάστηκαν, ούτε συγκρίσιμος μεταξύ handles καταλόγων. Αντιμετωπίστε τον όπως θα αντιμετωπίζατε την τιμή επιστροφής της tell σε file handle: αδιαφανής για σας, ουσιαστική μόνο για την αντίστοιχη seekdir.

Σύνοψη#

telldir DIRHANDLE

Τι επιστρέφεται#

Έναν ακέραιο σε επιτυχία, undef σε αποτυχία (για παράδειγμα, αν το DIRHANDLE δεν είναι ανοιχτό handle καταλόγου). Ο ακέραιος εγγυάται πλήρη κύκλο μέσω της seekdir μόνο πάνω στο ίδιο ανοιχτό handle καταλόγου· το κλείσιμο και ξανα-άνοιγμα του καταλόγου ακυρώνει κάθε διακριτικό που επιστράφηκε προηγουμένως.

opendir my $dh, $path or die "opendir $path: $!";
my $pos = telldir $dh;
# ... readdir a few entries ...
seekdir $dh, $pos;           # back to where $pos was taken

Καθολική κατάσταση που επηρεάζει#

Θέτει την $! σε αποτυχία.

Παραδείγματα#

Σελιδοδείκτης σε μια θέση και μετά επιστροφή σε αυτήν:

opendir my $dh, "." or die "opendir: $!";
readdir $dh;                 # consume "."
my $mark = telldir $dh;
my @rest = readdir $dh;      # drain the rest
seekdir $dh, $mark;
my @again = readdir $dh;     # same entries as @rest
closedir $dh;

Καταγράψτε ένα διακριτικό πριν από κάθε εγγραφή ώστε να μπορείτε να επαναφέρετε ένα βήμα πίσω:

opendir my $dh, $path or die "opendir $path: $!";
my $prev;
while (defined(my $entry = readdir $dh)) {
    last if $entry eq "STOP";
    $prev = telldir $dh;     # position *after* the current entry
}
seekdir $dh, $prev if defined $prev;

Η επιστροφή στην αρχή γίνεται καλύτερα με τη rewinddir παρά απομνημονεύοντας το διακριτικό από πριν την πρώτη readdir:

opendir my $dh, $path or die "opendir $path: $!";
my @first_pass  = readdir $dh;
rewinddir $dh;               # cleaner than seekdir $dh, $start_token
my @second_pass = readdir $dh;

Ελέγξτε ρητά για αποτυχία όταν το handle μπορεί να είναι κλειστό:

my $pos = telldir $dh;
defined $pos or die "telldir failed: $!";

Οριακές περιπτώσεις#

  • Το διακριτικό είναι αδιαφανές. Μη συγκρίνετε, προσθέτετε, αφαιρείτε, ή αποθηκεύετε διαρκώς την τιμή. Είναι έγκυρη μόνο για τη seekdir πάνω στο ίδιο ανοιχτό handle καταλόγου εντός της ίδιας διεργασίας.

  • Μη φορητό μεταξύ handles. Δύο κλήσεις opendir στον ίδιο κατάλογο παράγουν ανεξάρτητα handles· ένα διακριτικό από το ένα είναι ανούσιο για το άλλο.

  • Όχι σταθερό σε closedir / opendir. Το ξανα-άνοιγμα του καταλόγου ξεκινάει φρέσκια επανάληψη· τα παλιά διακριτικά δεν αναφέρονται πια σε τίποτα.

  • Συμπίεση καταλόγου. Αν το υποκείμενο σύστημα αρχείων ή άλλη διεργασία τροποποιήσει τον κατάλογο (προσθέσει, αφαιρέσει, ή μετονομάσει εγγραφές) μεταξύ της telldir και της αντίστοιχης seekdir, η ανανεωμένη θέση μπορεί να παραλείψει εγγραφές, να επαναλάβει εγγραφές, ή να προσγειωθεί σε διαφορετική εγγραφή από αυτή που αρχικά σελιδοποιήθηκε. Αυτό είναι ιδιότητα του ζεύγους telldir(3) / seekdir(3) της βιβλιοθήκης C και δεν είναι κάτι που η Perl καλύπτει. Πάρτε στιγμιότυπο του καταλόγου με readdir σε λίστα αν χρειάζεστε σταθερότητα.

  • Κλειστό ή ποτέ-μη-ανοιγμένο handle. Επιστρέφει undef και θέτει την $!.

  • Bareword έναντι βαθμωτού handle. Και τα δύο telldir DH και telldir $dh δουλεύουν. Η μορφή bareword είναι καθολική σε επίπεδο πακέτου· η βαθμωτή μορφή κρατάει αναφορά σε ανώνυμο handle καταλόγου που δημιουργήθηκε από opendir my $dh, ....

Διαφορές από το upstream#

Πλήρως συμβατό με το upstream Perl 5.42.

Δείτε επίσης#

  • seekdir - ο μόνος καταναλωτής ενός διακριτικού telldir· επαναφέρει το DIRHANDLE στη σελιδοποιημένη θέση

  • readdir - ο επαναλήπτης του οποίου τη θέση αναφέρει η telldir· προωθεί τον δρομέα που παρατηρεί η telldir

  • rewinddir - φθηνότερη από τη seekdir σε διακριτικό αρχής ροής όταν θέλετε απλώς να επαναλάβετε ξανά τον κατάλογο

  • opendir - δημιουργεί το DIRHANDLE που ερωτά η telldir· κάθε διακριτικό telldir είναι δεμένο σε μία κλήση open

  • closedir - ακυρώνει κάθε διακριτικό telldir για το handle

  • tell - το ανάλογο για file handle· ίδιο συμβόλαιο αδιαφανούς διακριτικού, διαφορετική υποκείμενη κλήση συστήματος