Δημιουργήστε έναν φάκελο αν δεν υπάρχει ήδη

Έχω συναντήσει μερικές περιπτώσεις με εγκαταστάσεις WordPress με Bluehost όπου αντιμετώπισα σφάλματα με το θέμα μου WordPress επειδή ο φάκελος uploads wp-content/uploads δεν ήταν παρών.

Προφανώς ο εγκαταστάτης WP του cPanel της Bluehost δεν δημιουργεί αυτό το φάκελο, αν και η HostGator το κάνει.

Έτσι πρέπει να προσθέσω κώδικα στο θέμα μου που να ελέγχει για το φάκελο και να τον δημιουργεί διαφορετικά.

Λύση

Δοκιμάστε αυτό:

if (!file_exists('path/to/directory')) {
    mkdir('path/to/directory', 0777, true);
}

Σημειώστε ότι το 0777 είναι ήδη ο προεπιλεγμένος τρόπος λειτουργίας για τους καταλόγους και μπορεί ακόμα να τροποποιηθεί από την τρέχουσα umask.

Σχόλια (10)

Κάτι πιο οικουμενικό, αφού αυτό εμφανίζεται στο google. Ενώ οι λεπτομέρειες είναι πιο συγκεκριμένες, ο τίτλος αυτής της ερώτησης είναι πιο καθολικός.

/** 
 * recursively create a long directory path
 */
function createPath($path) {
    if (is_dir($path)) return true;
    $prev_path = substr($path, 0, strrpos($path, '/', -2) + 1 );
    $return = createPath($prev_path);
    return ($return && is_writable($prev_path)) ? mkdir($path) : false;
}

Αυτό θα πάρει μια διαδρομή, ενδεχομένως με μια μεγάλη αλυσίδα μη δημιουργημένων καταλόγων, και θα συνεχίσει να ανεβαίνει έναν κατάλογο μέχρι να φτάσει σε έναν υπάρχοντα κατάλογο. Τότε θα προσπαθήσει να δημιουργήσει τον επόμενο κατάλογο σε αυτόν τον κατάλογο, και θα συνεχίσει μέχρι να δημιουργήσει όλους τους καταλόγους. Επιστρέφει true αν είναι επιτυχής.

Θα μπορούσε να βελτιωθεί παρέχοντας ένα επίπεδο διακοπής ώστε να αποτυγχάνει μόνο αν ξεπεράσει το φάκελο χρήστη ή κάτι τέτοιο και συμπεριλαμβάνοντας τα δικαιώματα.

Σχόλια (3)

Τι θα λέγατε για μια βοηθητική συνάρτηση όπως αυτή:

function makeDir($path)
{
     $ret = mkdir($path); // use @mkdir if you want to suppress warnings/errors
     return $ret === true || is_dir($path);
}

Θα επιστρέφει true αν ο κατάλογος δημιουργήθηκε επιτυχώς ή υπάρχει ήδη, και false αν ο κατάλογος δεν μπόρεσε να δημιουργηθεί.

Μια καλύτερη εναλλακτική λύση είναι αυτή (δεν θα πρέπει να δίνει προειδοποιήσεις):

function makeDir($path)
{
     return is_dir($path) || mkdir($path);
}
Σχόλια (5)