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 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. Ο πυρήνας μασκάρει το παρεχόμενο mode με την umask της τρέχουσας διεργασίας, οπότε το πραγματικό mode του καταλόγου είναι MODE & ~umask. Μια τυπική umask 022 μετατρέπει το προεπιλεγμένο 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.

Καθολική κατάσταση που επηρεάζει#

  • Θέτει την $! (errno) σε αποτυχία· την αφήνει αμετάβλητη σε επιτυχία.

  • Διαβάζει το FILENAME από την $_ όταν καλείται χωρίς ορίσματα.

  • Τα πραγματικά bits δικαιωμάτων εξαρτώνται από την umask της διεργασίας.

Παραδείγματα#

Δημιουργία καταλόγου με ρητό 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
    
  • MODE omitted entirely. mkdir $path is mkdir $path, 0777

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

  • Bits εκτός δικαιωμάτων στο MODE. Τα bits setuid / setgid / sticky σε μια κλήση mkdir έχουν αποτελέσματα καθορισμένα από την υλοποίηση. Ρυθμίστε τα με επακόλουθο chmod αν τα χρειάζεστε.

  • Σύστημα αρχείων μόνο για ανάγνωση ή απόν δικαίωμα εγγραφής στον γονέα αποτυγχάνει με EROFS ή EACCES αντίστοιχα. Η $! τα διακρίνει.

Διαφορές από το upstream#

Πλήρως συμβατό με το upstream Perl 5.42.

Δείτε επίσης#

  • rmdir - αφαίρεση κενού καταλόγου· η αντίστροφη λειτουργία

  • chmod - προσαρμογή bits δικαιωμάτων μετά τη δημιουργία όταν η umask διαφορετικά θα τα στένευε

  • umask - η μάσκα που σιωπηρά περιορίζει κάθε mkdir MODE

  • stat - επιθεωρήστε τον τύπο και το mode μιας υπάρχουσας διαδρομής, π.χ. για να ξεχωρίσετε «ήδη κατάλογος» από «υπάρχει ως αρχείο»

  • File::Path::make_path - αναδρομική δημιουργία καταλόγων· το σωστό εργαλείο όταν οι ενδιάμεσοι γονείς μπορεί να μην υπάρχουν