I/O

rewinddir#

Επαναφέρει ένα handle καταλόγου στην αρχή της λίστας του.

Η rewinddir θέτει την τρέχουσα θέση του DIRHANDLE πίσω στην αρχή του καταλόγου, ώστε η επόμενη κλήση readdir να επιστρέψει ξανά την πρώτη εγγραφή. Είναι το αντίστοιχο της seek σε file handle για handle καταλόγου: κανένα εκ νέου άνοιγμα, καμία εκ νέου σάρωση του γονικού καταλόγου - απλώς μια επαναφορά θέσης στο ανοιχτό handle.

Σύνοψη#

rewinddir DIRHANDLE

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

1 σε επιτυχία, 0 σε αποτυχία (με το $! τεθειμένο). Η αποτυχία είναι σπάνια στην πράξη - η συνηθισμένη αιτία είναι ένα handle που δεν ανοίχτηκε ποτέ ή έχει ήδη κλείσει. Ελέγξτε την τιμή επιστροφής αν σας ενδιαφέρει είτε η μία είτε η άλλη περίπτωση:

rewinddir $dh
    or die "rewinddir failed: $!";

Τυπική χρήση#

Έχετε ήδη διασχίσει έναν κατάλογο με readdir και θέλετε να τον διασχίσετε ξανά χωρίς να πληρώσετε για ένα ακόμη opendir:

opendir my $dh, $path or die "opendir $path: $!";

my @all = readdir $dh;          # first pass: collect everything

rewinddir $dh;                  # back to the top

while (my $entry = readdir $dh) {   # second pass: process one by one
    next if $entry =~ /^\.\.?\z/;
    process("$path/$entry");
}

closedir $dh;

Ένα δεύτερο συνηθισμένο μοτίβο είναι η επαναχρησιμοποίηση ενός handle σε αρκετές σαρώσεις με διαφορετικά φίλτρα, όπου το εκ νέου άνοιγμα θα ήταν σπατάλη ή θα έμπαινε σε race με ταυτόχρονες αλλαγές του καταλόγου:

opendir my $dh, $path or die $!;

my @perl = grep { /\.p[lm]\z/ } readdir $dh;
rewinddir $dh;
my @text = grep { /\.txt\z/  } readdir $dh;

closedir $dh;

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

  • Μη ανοιγμένο ή κλειστό handle: επιστρέφει 0 και θέτει το $!. Υπό use warnings λαμβάνετε επίσης την προειδοποίηση rewinddir() attempted on invalid dirhandle.

  • Αλλαγές καταλόγου κατά τη μέση της σάρωσης: η rewinddir δεν εγγυάται ότι θα αναδείξει εγγραφές που δημιουργήθηκαν (ή θα κρύψει εγγραφές που αφαιρέθηκαν) αφότου επέστρεψε η opendir. Η υποκείμενη rewinddir(3) λειτουργεί στην προσωρινά αποθηκευμένη ροή καταλόγου του πυρήνα· το αν μια επαναφερμένη σάρωση παρατηρεί ταυτόχρονες mkdir, unlink, ή rename στον ίδιο κατάλογο εξαρτάται από το σύστημα αρχείων και το λειτουργικό σύστημα. Αν χρειάζεστε ένα φρέσκο στιγμιότυπο, ξανακάντε closedir και opendir.

  • Δεν είναι αναζήτηση σε αυθαίρετη θέση: η rewinddir επαναφέρει στην αρχή και τίποτε άλλο. Για να επιστρέψετε σε μια απομνημονευμένη θέση στη μέση του καταλόγου χρησιμοποιήστε telldir / seekdir αντ” αυτής.

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

  • Φορητότητα: η rewinddir είναι κλήση POSIX. Σε πλατφόρμες χωρίς λειτουργικό rewinddir(3) ενδέχεται να υλοποιείται με κλείσιμο και εκ νέου άνοιγμα του καταλόγου· δείτε το L<perlport/rewinddir> για την ιστορική λίστα. Στο Linux (την πλατφόρμα που στοχεύει το pperl) αυτό δεν αποτελεί πρόβλημα.

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

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

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

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

  • readdir - διαβάζει την επόμενη εγγραφή· συνεχίζει από όπου άφησε τη ροή η rewinddir (από την αρχή)

  • closedir - απελευθερώνει το handle· συνδυάστε με opendir όταν μια επαναφερμένη σάρωση δεν αρκεί και χρειάζεστε ένα φρέσκο στιγμιότυπο του καταλόγου

  • telldir - καταγράφει την τρέχουσα θέση ώστε να μπορείτε να επιστρέψετε σε αυτή αργότερα

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