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 στο οποίο λειτουργεί ηrewinddirreaddir- διαβάζει την επόμενη εγγραφή· συνεχίζει από όπου άφησε τη ροή ηrewinddir(από την αρχή)closedir- απελευθερώνει το handle· συνδυάστε μεopendirόταν μια επαναφερμένη σάρωση δεν αρκεί και χρειάζεστε ένα φρέσκο στιγμιότυπο του καταλόγουtelldir- καταγράφει την τρέχουσα θέση ώστε να μπορείτε να επιστρέψετε σε αυτή αργότεραseekdir- επαναφέρει μια θέση που είχε προηγουμένως αποτυπωθεί από τηνtelldir· τοrewinddir $dhείναι ισοδύναμο με τοseekdir $dh, 0σε συμμορφωμένα συστήματα, αλλά ηrewinddirείναι η φορητή γραφή