Filehandles, αρχεία, κατάλογοι
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
FILENAMEmust already exist. For recursive creation, reach forFile::Path::make_pathinstead.
Σύνοψη#
mkdir FILENAME, MODE
mkdir FILENAME
mkdir
Τι επιστρέφεται#
1 σε επιτυχία, 0 σε αποτυχία με την $! τεθειμένη στο errno του συστήματος. Σε αντίθεση με τις περισσότερες πρωτογενείς λειτουργίες I/O, η τιμή αποτυχίας είναι ένα απλό ψευδές 0, όχι undef - ελέγξτε την τιμή επιστροφής, και μετά συμβουλευτείτε την $! για τον λόγο:
mkdir $path, 0755
or die "mkdir $path failed: $!";
Προεπιλεγμένα ορίσματα#
Και τα δύο ορίσματα έχουν προεπιλογές:
Το
MODEέχει προεπιλογή0777. Ο πυρήνας μασκάρει το παρεχόμενο mode με τηνumaskτης τρέχουσας διεργασίας, οπότε το πραγματικό mode του καταλόγου είναιMODE & ~umask. Μια τυπικήumask022μετατρέπει το προεπιλεγμένο0777σε0755στον δίσκο.Το
FILENAMEέχει προεπιλογή την$_. Μια σκέτηmkdir;μέσα σε βρόχο πάνω σε διαδρομές δημιουργεί καθεμία με τη σειρά:mkdir for qw(logs cache tmp);
Περάστε το MODE ρητά όποτε ο κατάλογος πρέπει να είναι ιδιωτικός (mail spools, αποθήκες κλειδιών, κατάλογοι συνεδριών). Διαφορετικά προτιμήστε ένα επιτρεπτικό MODE και αφήστε την umask του χρήστη να το στενέψει - η σελίδα της umask συζητάει το trade-off αναλυτικά. Η ρύθμιση bits εκτός του εύρους δικαιωμάτων (π.χ. setuid/setgid/sticky) αποδίδει συμπεριφορά καθορισμένη από την υλοποίηση κατά POSIX 1003.1-2008.
Καθολική κατάσταση που επηρεάζει#
Παραδείγματα#
Δημιουργία καταλόγου με ρητό mode:
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 τις αφαιρεί πριν την κλήση συστήματος ώστε συστήματα αρχείων που απορρίπτουν το
"foo/"να συμπεριφέρονται και πάλι συνεπώς.Αναντιστοιχία δικαιωμάτων. Το
MODEμασκάρεται από τηνumask. Αν χρειάζεστε ακριβές mode στον δίσκο, είτε αποθηκεύστε και επαναφέρετε την umask, είτε κάντεchmodστον κατάλογο μετά τη δημιουργία:mkdir $dir, 0700 or die $!; chmod 0700, $dir; # defeat any umask surprises
MODEomitted entirely.mkdir $pathismkdir $path, 0777still masked by
umask, so the on-disk mode is typically0755, not0777.
Bits εκτός δικαιωμάτων στο
MODE. Τα bits setuid / setgid / sticky σε μια κλήσηmkdirέχουν αποτελέσματα καθορισμένα από την υλοποίηση. Ρυθμίστε τα με επακόλουθοchmodαν τα χρειάζεστε.Σύστημα αρχείων μόνο για ανάγνωση ή απόν δικαίωμα εγγραφής στον γονέα αποτυγχάνει με
EROFSήEACCESαντίστοιχα. Η$!τα διακρίνει.
Διαφορές από το upstream#
Πλήρως συμβατό με το upstream Perl 5.42.
Δείτε επίσης#
rmdir- αφαίρεση κενού καταλόγου· η αντίστροφη λειτουργίαchmod- προσαρμογή bits δικαιωμάτων μετά τη δημιουργία όταν ηumaskδιαφορετικά θα τα στένευεumask- η μάσκα που σιωπηρά περιορίζει κάθεmkdir MODEstat- επιθεωρήστε τον τύπο και το mode μιας υπάρχουσας διαδρομής, π.χ. για να ξεχωρίσετε «ήδη κατάλογος» από «υπάρχει ως αρχείο»File::Path::make_path- αναδρομική δημιουργία καταλόγων· το σωστό εργαλείο όταν οι ενδιάμεσοι γονείς μπορεί να μην υπάρχουν