Создайте папку, если она еще не существует

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

По-видимому, программа установки WP cPanel Bluehost не создает эту папку, хотя HostGator создает.

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

Комментарии к вопросу (1)
Решение

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

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

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

Комментарии (10)

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

mkdir('path/to/directory', 0755, true);
Комментарии (1)

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

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

if (!is_dir('path/to/directory')) {
    mkdir('path/to/directory', 0777, true);
}
Комментарии (1)

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

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

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

Комментарии (0)

В WordPress есть's также очень удобная функция 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 
Комментарии (0)

Мне нужно то же самое для сайта логин. Мне нужно создать каталог с двумя переменными. Долларов каталог является основной папке, где я хотел создать еще одну подпапку с номером лицензии.

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);
}
Комментарии (0)

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

if (!is_dir('path/to/directory')) {
    mkdir('path/to/directory');
}
Комментарии (0)

Вы можете попробовать также:

$dirpath = "path/to/dir";
$mode = "0777";
is_dir($dirpath) || mkdir($dirpath, $mode, true);
Комментарии (0)

Если вы хотите избежать проблемы file_exists против 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);
}
Комментарии (0)

Чтобы создать папку, если она не'т уже существуют

Рассматривая вопрос'ы окружающей среды.

  • Вордпресс.
  • Сервер Хостинг.
  • Предполагаю, что Linux не Windows, работающих на PHP.

И цитирую: http://php.net/manual/en/function.mkdir.php

боол функция mkdir ( строка $в Pathname [, инт $режим = 0777 [, bool и $рекурсивный = значение false [, $ресурсов контексте ]]] )

Руководство говорит, что единственный обязательный параметр $путь!

таким образом, мы можем просто код:

<?php
error_reporting(0); 
if(!mkdir('wp-content/uploads')){
   // todo
}
?>

Объяснение:

Мы не'т иметь, чтобы передать какой-либо параметр или проверить, существует ли папка или даже передать параметр режим, если требуется; по следующим причинам:

  • Команда создать папку с 0755 разрешения (хостинга папка'ы разрешением по умолчанию) или 0777 команда'ы по умолчанию.
  • режим игнорируется на Windows хостинг используете PHP.
  • Уже команда команды mkdir имеет строение в Проверка существует ли папка; поэтому мы должны проверить возвращаемое только истина|ложь, и не ошибка, а только предупреждение, и предупреждения отключен на серверах по умолчанию.
  • Как в скорости, это быстрее, если предупреждение отключено.

Это просто другой способ взглянуть на этот вопрос и не претендует на лучше или наиболее оптимальное решение.

Проверено на PHP7, производственная сервера Linux

Комментарии (0)

Мы всегда должны modularise наш код и я'вэ написано же проверить его ниже... Мы сначала проверяем каталога, если каталог отсутствует, то создайте каталог.

$boolDirPresents = $this->CheckDir($DirectoryName);

if (!$boolDirPresents) {
        $boolCreateDirectory = $this->CreateDirectory($DirectoryName);
        if ($boolCreateDirectory) {
        echo "Created successfully";
      }
  }

function CheckDir($DirName) {
    if (file_exists($DirName)) {
        echo "Dir Exists<br>";
        return true;
    } else {
        echo "Dir Not Absent<br>";
        return false;
    }
}

function CreateDirectory($DirName) {
    if (mkdir($DirName, 0777)) {
        return true;
    } else {
        return false;
    }
}
Комментарии (0)
$upload = wp_upload_dir();
$upload_dir = $upload['basedir'];
$upload_dir = $upload_dir . '/newfolder';
if (! is_dir($upload_dir)) {
   mkdir( $upload_dir, 0700 );
}
Комментарии (0)
if (!is_dir('path_directory')) {
    @mkdir('path_directory');
}
Комментарии (4)

Сначала нужно проверить, если каталог существует. file_exists(&#39;путь_к_папке&#39;)

Затем использовать команду mkdir(путь_к_папке) для создания каталога

mkdir( string $pathname [, int $mode = 0777 [, bool $recursive = FALSE [, resource $context ]]] ) : bool

Подробнее о функция mkdir() здесь

Вот полный код:

$structure = './depth1/depth2/depth3/';
if (!file_exists($structure)) {
    mkdir($structure);
}
Комментарии (0)