Создать папку, если она еще не существует - PullRequest
579 голосов
/ 20 февраля 2010

Я столкнулся с несколькими случаями установки WordPress с Bluehost, где я столкнулся с ошибками в моей теме WordPress, поскольку папка для загрузки wp-content/uploads отсутствовала.

Очевидно, установщик Bluehost cPanel WP не создает эту папку, хотя HostGator делает.

Поэтому мне нужно добавить код в мою тему, который проверяет папку и создает ее в противном случае.

Ответы [ 15 ]

1126 голосов
/ 20 февраля 2010

Попробуйте это:

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

Обратите внимание, что 0777 уже является режимом по умолчанию для каталогов и может быть изменен текущим значением umask.

123 голосов
/ 25 февраля 2013

Вот недостающий кусок. Вам нужно передать флаг 'recursive' в качестве третьего аргумента (логическое значение true) при вызове mkdir:

mkdir('path/to/directory', 0755, true);
62 голосов
/ 01 июня 2011

Что-то более универсальное, так как это появляется в 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.

Может быть улучшено путем предоставления уровня остановки, так что он просто завершится неудачей, если выйдет за пределы пользовательской папки или чего-то еще, и включит разрешения.

54 голосов
/ 20 февраля 2010

Как насчет вспомогательной функции, подобной этой:

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

Возвращается true, если каталог был успешно создан или уже существует, и false, если каталог не может быть создан.

A лучше альтернатива такова (не должно быть предупреждений):

function makeDir($path)
{
     return is_dir($path) || mkdir($path);
}
24 голосов
/ 14 сентября 2016

Более быстрый способ создания папки:

if (!is_dir('path/to/directory')) {
    mkdir('path/to/directory', 0777, true);
}
22 голосов
/ 06 июля 2014

Рекурсивно создать путь к каталогу:

function makedirs($dirpath, $mode=0777) {
    return is_dir($dirpath) || mkdir($dirpath, $mode, true);
}

Вдохновленный Python's os.makedirs()

8 голосов
/ 12 апреля 2014

В WordPress есть также очень удобная функция wp_mkdir_p , которая будет рекурсивно создавать структуру каталогов.

Источник для справки: -

function wp_mkdir_p( $target ) {
    $wrapper = null;

    // strip the protocol
    if( wp_is_stream( $target ) ) {
        list( $wrapper, $target ) = explode( '://', $target, 2 );
    }

    // from php.net/mkdir user contributed notes
    $target = str_replace( '//', '/', $target );

    // put the wrapper back on the target
    if( $wrapper !== null ) {
        $target = $wrapper . '://' . $target;
    }

    // safe mode fails with a trailing slash under certain PHP versions.
    $target = rtrim($target, '/'); // Use rtrim() instead of untrailingslashit to avoid formatting.php dependency.
    if ( empty($target) )
        $target = '/';

    if ( file_exists( $target ) )
        return @is_dir( $target );

    // We need to find the permissions of the parent folder that exists and inherit that.
    $target_parent = dirname( $target );
    while ( '.' != $target_parent && ! is_dir( $target_parent ) ) {
        $target_parent = dirname( $target_parent );
    }

    // Get the permission bits.
    if ( $stat = @stat( $target_parent ) ) {
        $dir_perms = $stat['mode'] & 0007777;
    } else {
        $dir_perms = 0777;
    }

    if ( @mkdir( $target, $dir_perms, true ) ) {

        // If a umask is set that modifies $dir_perms, we'll have to re-set the $dir_perms correctly with chmod()
        if ( $dir_perms != ( $dir_perms & ~umask() ) ) {
            $folder_parts = explode( '/', substr( $target, strlen( $target_parent ) + 1 ) );
            for ( $i = 1; $i <= count( $folder_parts ); $i++ ) {
                @chmod( $target_parent . '/' . implode( '/', array_slice( $folder_parts, 0, $i ) ), $dir_perms );
            }
        }

        return true;
    }

    return false;
}
5 голосов
/ 12 августа 2013

Мне нужно то же самое для входа на сайт. Мне нужно было создать каталог с двумя переменными. Каталог $ - это основная папка, в которой я хотел создать другую подпапку с номером лицензии пользователя.

include_once("../include/session.php");
$lnum = $session->lnum; //Users license number from sessions
$directory = uploaded_labels; // Name of directory that folder is being created in

if (!file_exists($directory."/".$lnum)) {
mkdir($directory."/".$lnum, 0777, true);
}
3 голосов
/ 27 апреля 2016

Это самое современное решение без подавления ошибок:

if (!is_dir('path/to/directory')) {
    mkdir('path/to/directory');
}
2 голосов
/ 06 марта 2019

Если вы хотите избежать проблемы file_exists VS is_dir, я бы посоветовал вам посмотреть здесь

Я попробовал это, и он создает каталог, только если каталог не существует . Ему все равно, есть ли файл с таким именем.

/* Creates the directory if it does not exist */
$path_to_directory = 'path/to/directory';
if (!file_exists($path_to_directory) && !is_dir($path_to_directory)) {
    mkdir($path_to_directory, 0777, true);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...