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- מקם מחדש את זרם הספרייה לערך שהוחזר בעבר על־ידיtelldirtelldir- החזר את המיקום הנוכחי בתוך זרם ספרייה פתוחclose- סגור מטפל קובץ; אינו עובד על מטפלי ספרייה