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

mkdir#

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

mkdir מבקש ממערכת ההפעלה ליצור את הספרייה הקרויה ב־FILENAME, עם ביטי הרשאה הניתנים ב־MODE (מוגבלים נוסף על־ידי ה־umask של התהליך). הוא יוצר בדיוק ספרייה אחת

  • 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 הושמט לחלוטין. mkdir $path הוא mkdir $path, 0777

    • עדיין מסוכך על־ידי umask, ולכן המצב על הדיסק הוא בדרך כלל 0755, לא 0777.

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

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

הבדלים מ־upstream#

Fully compatible with upstream Perl 5.44.

ראו גם#

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

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

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

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

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