closedir#
Κλείνει ένα handle καταλόγου που άνοιξε η opendir.
Η closedir αποδεσμεύει τη ροή καταλόγου του λειτουργικού συστήματος που συνδέεται με το DIRHANDLE και ελευθερώνει τη θέση ώστε το handle να μπορεί να επαναχρησιμοποιηθεί. Είναι το αντίστοιχο της opendir, και ο μόνος υποστηριζόμενος τρόπος κλεισίματος ενός handle καταλόγου - η close λειτουργεί σε filehandles και δεν δέχεται handle καταλόγου, επειδή τα filehandles και τα handles καταλόγων ζουν σε χωριστούς χώρους ονομάτων.
Σύνοψη#
closedir DIRHANDLE
closedir $dh
Τι επιστρέφεται#
1 σε επιτυχία, undef σε αποτυχία (με το $! ρυθμισμένο στο σφάλμα από την υποκείμενη κλήση closedir(3)). Αξίζει να ελέγχεται η τιμή επιστροφής σε δικτυακά ή FUSE-υποστηριζόμενα συστήματα αρχείων όπου το κλείσιμο ενδέχεται να αναδείξει ένα ετεροχρονισμένο σφάλμα I/O.
closedir $dh
or warn "closedir $path failed: $!";
Το κλείσιμο ενός handle καταλόγου που είναι ήδη κλειστό, ή ενός που δεν άνοιξε ποτέ επιτυχώς, επιστρέφει undef και - υπό use warnings - εκπέμπει μια προειδοποίηση closedir() attempted on invalid dirhandle.
Λεξιλογικά handles καταλόγων και αυτόματο κλείσιμο#
Ένα handle καταλόγου που αποθηκεύεται σε λεξιλογικό βαθμωτό - η μορφή που παράγει το opendir my $dh, $path - κλείνει αυτόματα όταν το βαθμωτό βγει από την εμβέλεια (ή ανατεθεί ξανά, ή τερματιστεί το πρόγραμμα). Η ρητή closedir τότε είναι ζήτημα χρονισμού, όχι ορθότητας:
sub entries {
my ($path) = @_;
opendir my $dh, $path or die "opendir $path: $!";
return readdir $dh;
# $dh is closed here as it leaves scope
}
Καλέστε ρητά την closedir όταν χρειάζεται η αποδέσμευση να συμβεί σε γνωστό σημείο - πριν από fork, πριν τη μετονομασία του καταλόγου σε πλατφόρμες που τον κρατούν ανοιχτό, πριν τον έλεγχο της τιμής επιστροφής, ή απλώς όταν η περικλείουσα εμβέλεια είναι μεγάλη και κρατά πολλούς άλλους πόρους.
Τα bareword handles καταλόγων (καθολικά πακέτου, π.χ. opendir DH, $path) δεν κλείνουν αυτόματα. Διατηρούνται μέχρι να τερματιστεί το πρόγραμμα ή να κληθεί η closedir DH.
Καθολική κατάσταση που επηρεάζει#
Η closedir δεν διαβάζει ούτε γράφει σε κάποια από τις τεκμηριωμένες ειδικές μεταβλητές της Perl. Θέτει το $! σε αποτυχία. Δεν επηρεάζει το $_, το επιλεγμένο filehandle, ούτε καμία από τις καθολικές μεταβλητές διαχωριστών εξόδου.
Παραδείγματα#
Βασικός κύκλος ανοίγματος/ανάγνωσης/κλεισίματος:
opendir my $dh, "." or die "opendir: $!";
my @names = readdir $dh;
closedir $dh;
Έλεγχος της τιμής επιστροφής - χρήσιμο σε δικτυακά συστήματα αρχείων:
opendir my $dh, "/mnt/nfs/project" or die "opendir: $!";
my @entries = readdir $dh;
closedir $dh
or die "closedir failed: $!";
Επαναφορά στην αρχή με rewinddir αντί για closedir + opendir όταν θέλετε να ξαναδιαβάσετε τον ίδιο κατάλογο:
opendir my $dh, $path or die $!;
my @first = readdir $dh;
rewinddir $dh;
my @again = readdir $dh; # same set as @first
closedir $dh;
Bareword handle - πρέπει να κλείσει ρητά:
opendir DH, "/etc" or die $!;
while (my $name = readdir DH) {
last if $name eq "hosts";
}
closedir DH; # not optional for barewords
Η χρήση της close σε handle καταλόγου δεν δουλεύει:
opendir my $dh, "." or die $!;
close $dh; # wrong - does not close the dir
closedir $dh; # correct
Οριακές περιπτώσεις#
closeσε handle καταλόγου: τα filehandles και τα handles καταλόγων είναι διακριτοί τύποι. Ηcloseσε handle καταλόγου είναι είτε no-op είτε σφάλμα ανάλογα με τη μορφή του handle· χρησιμοποιείτε πάντα τηνclosedirγια να κλείσετε ό,τι άνοιξε ηopendir.Διπλό κλείσιμο: η κλήση της
closedirδύο φορές στο ίδιο handle επιστρέφειundefστη δεύτερη κλήση και θέτει το$!. Υπόuse warningsεκπέμπεται προειδοποίησηclosedir() attempted on invalid dirhandle.Κλεισμένο ή ποτέ-ανοιχτό handle: ίδια συμπεριφορά με το διπλό κλείσιμο - επιστροφή
undefκαι προειδοποίηση υπόuse warnings.Εκκρεμής κατάσταση
readdir: ηclosedirαπορρίπτει οποιεσδήποτε αδιάβαστες εγγραφές. Αν θέλετε να επανεκκινήσετε την επανάληψη, χρησιμοποιήστεrewinddirαντί για close + reopen.Θέσεις
seekdir/telldir: οι θέσεις που λαμβάνονται από τηνtelldirακυρώνονται από τηνclosedir. Έχουν νόημα μόνο για τη διάρκεια ζωής μίας ανοιχτής ροής καταλόγου.Έξοδος από εμβέλεια κατά τη διάρκεια εξαίρεσης: τα λεξιλογικά handles καταλόγων εξακολουθούν να κλείνουν όταν η εμβέλεια ξετυλίγεται μέσω
die, οπότε η ρητήclosedirσε κώδικα καθαρισμού είναι συνήθως περιττή.Fork: μετά από
fork, γονέας και παιδί μοιράζονται την κατάσταση της ροής καταλόγου στον πυρήνα· καθένας θα πρέπει να καλέσειclosedirστη διεργασία που δεν τη χρειάζεται πλέον.
Διαφορές από το upstream#
Πλήρως συμβατό με το upstream Perl 5.42.
Δείτε επίσης#
opendir- άνοιγμα handle καταλόγου· ηclosedirείναι το αντίστοιχό τηςreaddir- διαβάζει την επόμενη εγγραφή (ή όλες τις εγγραφές σε περιβάλλον λίστας) από ένα ανοιχτό handle καταλόγουrewinddir- επαναφέρει τη ροή καταλόγου στην αρχή χωρίς να την κλείσειseekdir- επανατοποθετεί τη ροή καταλόγου σε τιμή που επέστρεψε προηγουμένως ηtelldirtelldir- επιστρέφει την τρέχουσα θέση εντός μιας ανοιχτής ροής καταλόγουclose- κλείνει ένα file handle· δεν λειτουργεί σε handles καταλόγων