קלט/פלט

rewinddir#

מאפס מטפל ספרייה לתחילת רישומה.

rewinddir מחזיר את המיקום הנוכחי של DIRHANDLE חזרה לתחילת הספרייה, כך שקריאת readdir הבאה מחזירה שוב את הרשומה הראשונה. זהו בן־הזוג של מטפל־ספרייה ל־seek על מטפל קובץ: ללא פתיחה־מחדש, ללא סריקה־מחדש של ספריית האב - רק איפוס מיקום על המטפל הפתוח.

תקציר#

rewinddir DIRHANDLE

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

1 בהצלחה, 0 בכישלון (עם $! קבוע). כישלון הוא נדיר בפועל - הסיבה הרגילה היא מטפל שמעולם לא נפתח או שכבר נסגר. בדוק את ערך ההחזרה אם אכפת לך מאחד משני המקרים:

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;

תבנית נפוצה שנייה היא שימוש חוזר במטפל אחד על פני מספר סריקות עם מסננים שונים, היכן שפתיחה־מחדש תהיה מבזבזת או תיצור 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;

מקרי קצה#

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

  • שינויי ספרייה במהלך סריקה: rewinddir אינו מובטח להציף רשומות שנוצרו (או להסתיר רשומות שהוסרו) לאחר ש־opendir חזר. rewinddir(3) שמתחת פועל על זרם הספרייה הממוטמן של הקרנל; האם סריקה ש־rewound תצפה ב־mkdir, unlink או rename מקבילים באותה ספרייה תלוי במערכת הקבצים ובמערכת ההפעלה. אם דרוש לך snapshot רענן, בצע closedir ו־opendir שוב.

  • לא seek למיקום שרירותי: rewinddir מאפס לתחילה ולא יותר מזה. כדי לחזור למיקום אמצע־ספרייה שזכרת, השתמש ב־telldir / seekdir במקום.

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

  • ניידות: rewinddir היא קריאת POSIX. על פלטפורמות ללא rewinddir(3) עובד היא עשויה להיות ממומשת על־ידי סגירה ופתיחה־מחדש של הספרייה; ראה L<perlport/rewinddir> לרשימה ההיסטורית. ב־Linux (הפלטפורמה ש־pperl מכוון אליה) זו אינה דאגה.

הבדלים מ־upstream#

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

ראו גם#

  • opendir - פותח ספרייה ומקבל את המטפל ש־rewinddir פועל עליו

  • readdir - קורא את הרשומה הבאה; ממשיך מאיפה ש־rewinddir השאיר את הזרם (ההתחלה)

  • closedir - משחרר את המטפל; שלב עם opendir כאשר סריקת rewind אינה מספיקה ודרוש לך snapshot רענן של הספרייה

  • telldir - רושם את המיקום הנוכחי כדי שתוכל לחזור אליו מאוחר יותר

  • seekdir - משחזר מיקום שנלכד קודם לכן על־ידי telldir; rewinddir $dh שקול ל־seekdir $dh, 0 על מערכות תואמות, אך rewinddir הוא האיות הנייד