I/O

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 - επανατοποθετεί τη ροή καταλόγου σε τιμή που επέστρεψε προηγουμένως η telldir

  • telldir - επιστρέφει την τρέχουσα θέση εντός μιας ανοιχτής ροής καταλόγου

  • close - κλείνει ένα file handle· δεν λειτουργεί σε handles καταλόγων