קלט/פלט

closedir#

סוגר מטפל ספרייה שנפתח על־ידי opendir.

closedir משחרר את זרם הספרייה של מערכת ההפעלה המשויך ל־DIRHANDLE ומשחרר את החריץ כך שהמטפל יוכל לשמש מחדש. הוא המקביל ל־opendir, והדרך הנתמכת היחידה לסגור מטפל ספרייה - close פועל על מטפלי קובץ ואינו מקבל מטפל ספרייה, כי מטפלי קובץ ומטפלי ספרייה חיים במרחבי שמות נפרדים.

תקציר#

closedir DIRHANDLE
closedir $dh

מה מקבלים בחזרה#

1 בהצלחה, undef בכישלון (עם $! שנקבע לשגיאה מקריאת closedir(3) שמתחת). שווה לבדוק את ערך ההחזרה במערכות קבצים מרושתות או מבוססות FUSE שבהן הסגירה עשויה לחשוף שגיאת I/O דחויה.

closedir $dh
    or warn "closedir $path failed: $!";

סגירת מטפל ספרייה שכבר סגור, או כזה שמעולם לא נפתח בהצלחה, מחזירה undef ו־ - תחת use warnings - מנפיקה אזהרת closedir() attempted on invalid dirhandle.

מטפלי ספרייה לקסיקליים וסגירה אוטומטית#

מטפל ספרייה המאוחסן בסקלר לקסיקלי - הצורה שמופקת על־ידי 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 (גלובלים של חבילה, למשל opendir DH, $path) אינם נסגרים אוטומטית. הם מתמידים עד שהתוכנית מסתיימת או שנקרא closedir DH.

מצב גלובלי שהוא נוגע בו#

closedir אינו קורא או כותב לאף אחד מהמשתנים המיוחדים המתועדים של Perl. הוא קובע $! בכישלון. הוא אינו משפיע על $_, על מטפל הקובץ הנבחר, או על אף אחד מהגלובלים של מפריד הפלט.

דוגמאות#

מחזור בסיסי פתח/קרא/סגור:

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 - חייב להיסגר במפורש:

opendir DH, "/etc" or die $!;
while (my $name = readdir DH) {
    last if $name eq "hosts";
}
closedir DH;                         # not optional for barewords

שימוש ב־close על מטפל ספרייה אינו עובד:

opendir my $dh, "." or die $!;
close $dh;                           # wrong - does not close the dir
closedir $dh;                        # correct

מקרי קצה#

  • close על מטפל ספרייה: מטפלי קובץ ומטפלי ספרייה הם טיפוסים מובחנים. close על מטפל ספרייה הוא או no-op או שגיאה תלוי בצורת המטפל; השתמש תמיד ב־closedir לסגירת מה ש־opendir פתח.

  • סגירה כפולה: קריאה ל־closedir פעמיים על אותו מטפל מחזירה undef בקריאה השנייה וקובעת $!. תחת use warnings מונפקת אזהרת closedir() attempted on invalid dirhandle.

  • מטפל סגור או שמעולם לא נפתח: אותה התנהגות כמו סגירה כפולה - החזרת undef ואזהרה תחת use warnings.

  • מצב readdir ממתין: closedir משליך כל ערכים שלא נקראו. אם אתה רוצה להפעיל מחדש את האיטרציה, השתמש ב־rewinddir במקום close + reopen.

  • מיקומי seekdir / telldir: מיקומים שהושגו מ־telldir נפסלים על־ידי closedir. הם משמעותיים רק לאורך החיים של זרם ספרייה פתוח יחיד.

  • יציאת תחום במהלך חריגה: מטפלי ספרייה לקסיקליים עדיין נסגרים כשהתחום מתפרק דרך die, כך ש־closedir מפורש בקוד ניקוי הוא בדרך כלל מיותר.

  • Fork: לאחר fork, גם ההורה וגם הילד חולקים את מצב הקרנל של זרם הספרייה; כל אחד צריך לקרוא closedir בתהליך שכבר אינו זקוק לו.

הבדלים מ־upstream#

תואם מלא ל־upstream Perl 5.42.

ראו גם#

  • opendir - פתח מטפל ספרייה; closedir הוא המקביל לו

  • readdir - קרא את הערך הבא (או את כל הערכים בהקשר רשימה) ממטפל ספרייה פתוח

  • rewinddir - אפס את זרם הספרייה להתחלה מבלי לסגור אותו

  • seekdir - מקם מחדש את זרם הספרייה לערך שהוחזר בעבר על־ידי telldir

  • telldir - החזר את המיקום הנוכחי בתוך זרם ספרייה פתוח

  • close - סגור מטפל קובץ; אינו עובד על מטפלי ספרייה