מטפלי קובץ קבצים ספריות

mkdir#

יוצר ספרייה יחידה במערכת הקבצים.

mkdir asks the operating system to create the directory named by FILENAME, with permission bits given by MODE (further restricted by the process umask). It creates exactly one directory

  • every parent component in FILENAME must already exist. For recursive creation, reach for File::Path::make_path instead.

תקציר#

mkdir FILENAME, MODE
mkdir FILENAME
mkdir

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

1 בהצלחה, 0 בכשל עם $! קבוע ל־errno של המערכת. בניגוד לרוב פרימיטיבי I/O, ערך הכשל הוא 0 שקרי פשוט, לא undef - בדקו את ערך ההחזרה, ואז התייעצו עם $! לסיבה:

mkdir $path, 0755
    or die "mkdir $path failed: $!";

ארגומנטי ברירת מחדל#

לשני הארגומנטים ברירות מחדל:

  • ברירת המחדל של MODE היא 0777. הקרנל מסכך את המצב המסופק עם ה־umask של התהליך הנוכחי, כך שהמצב האפקטיבי של הספרייה הוא MODE & ~umask. umask טיפוסי של 022 הופך את ברירת המחדל 0777 ל־0755 על הדיסק.

  • ברירת המחדל של FILENAME היא $_. mkdir; חשוף בתוך לולאה על שמות נתיבים יוצר כל אחד בתורו:

    mkdir for qw(logs cache tmp);
    

העבירו את MODE במפורש בכל פעם שהספרייה צריכה להיות פרטית (mail spools, אחסון מפתחות, ספריות session). אחרת העדיפו MODE מקל ותנו ל־umask של המשתמש לצמצם אותו - הדף umask דן בפרשנות בפירוט. הגדרת ביטים מחוץ לטווח ההרשאה (לדוגמה setuid/setgid/sticky) מניבה התנהגות מוגדרת־מימוש לפי POSIX 1003.1-2008.

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

  • קובע את $! (errno) בכשל; משאיר אותו ללא שינוי בהצלחה.

  • קורא את FILENAME מ־$_ כאשר קוראים לו ללא ארגומנטים.

  • ביטי ההרשאה האפקטיביים תלויים ב־umask של התהליך.

דוגמאות#

יצירת ספרייה עם מצב מפורש:

mkdir "build", 0755
    or die "mkdir build: $!";

יצירה רק אם חסר, מבלי להתייחס ל־״כבר שם״ כשגיאה:

use Errno qw(EEXIST);
unless (mkdir "cache", 0700) {
    die "mkdir cache: $!" unless $! == EEXIST;
}

ספרייה פרטית - אל תניחו ל־umask להרחיב אותה:

mkdir "$ENV{HOME}/.secrets", 0700
    or die "mkdir secrets: $!";

צורה חשופה על רשימה, שימוש ב־$_ כשם הקובץ:

for (qw(a b c)) {
    mkdir or warn "mkdir $_: $!";
}

יצירה רקורסיבית אינה תפקידו של mkdir - השתמשו ב־File::Path:

use File::Path qw(make_path);
make_path("var/log/app/2026", { mode => 0755 })
    or die "make_path failed: $!";

מקרי קצה#

  • ההורה חייב להיות קיים. mkdir "a/b/c" נכשל עם ENOENT אם a/b חסר. השתמשו ב־File::Path::make_path עבור נתיבים עמוקים.

  • היעד כבר קיים. נכשל עם EEXIST, ללא קשר אם הרשומה הקיימת היא ספרייה, קובץ או symlink. בדקו את $! מול Errno::EEXIST כאשר ״כבר שם״ מקובל.

  • לוכסנים גוררים. POSIX 1003.1-1996 מתיר כל מספר של לוכסנים גוררים; Perl מסיר אותם לפני ה־syscall כך שמערכות קבצים שדוחות "foo/" עדיין יתנהגו באופן עקבי.

  • אי־התאמת הרשאות. MODE מסוכך על־ידי umask. אם אתם זקוקים למצב מדויק על הדיסק, או שמרו ושחזרו את ה־umask, או הפעילו chmod על הספרייה לאחר היצירה:

    mkdir $dir, 0700 or die $!;
    chmod 0700, $dir;                   # defeat any umask surprises
    
  • MODE omitted entirely. mkdir $path is mkdir $path, 0777

    • still masked by umask, so the on-disk mode is typically 0755, not 0777.

  • ביטים שאינם של הרשאה ב־MODE. ביטי setuid / setgid / sticky על קריאת mkdir בעלי תוצאות מוגדרות־מימוש. הגדירו אותם עם chmod עוקב אם אתם זקוקים להם.

  • מערכת קבצים לקריאה־בלבד או הרשאת כתיבה חסרה על ההורה נכשלת עם EROFS או EACCES בהתאמה. $! מבחין ביניהם.

הבדלים מ־upstream#

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

ראו גם#

  • rmdir - מסיר ספרייה ריקה; הפעולה ההופכית

  • chmod - התאמת ביטי הרשאה לאחר היצירה כאשר umask היה אחרת מצמצם אותם

  • umask - המסכה שמגבילה בשקט כל mkdir MODE

  • stat - בדיקת סוג ומצב של נתיב קיים, לדוגמה כדי להבחין בין ״כבר ספרייה״ ל־״קיים כקובץ״

  • File::Path::make_path - יצירת ספריות רקורסיבית; הכלי הנכון כאשר הורים ביניים עלולים שלא להיות קיימים