it-swarm.com.ru

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

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

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

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

544
Scott B

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

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

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

1074
Gumbo

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

mkdir('path/to/directory', 0755, true);
118
Satish Gadhave

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

Это займет путь, возможно, с длинной цепочкой несозданных каталогов, и будет идти вверх по одному каталогу, пока он не попадет в существующий каталог. Затем он попытается создать следующий каталог в этом каталоге и продолжит, пока не будут созданы все каталоги. Возвращает истину, если успешно.

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

61
phazei

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

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);
}
51
AndiDog

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

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

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

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

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

21
user

В 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;
}
7
Trevor Mills

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

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
Progrower

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

if (!is_dir('path/to/directory')) {
    mkdir('path/to/directory');
}
2
Andreas
$upload = wp_upload_dir();
$upload_dir = $upload['basedir'];
$upload_dir = $upload_dir . '/newfolder';
if (! is_dir($upload_dir)) {
   mkdir( $upload_dir, 0700 );
}
0
Nikunj Kathrotiya

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

Учитывая вопрос среды.

  • WordPress.
  • Сервер веб-хостинга.
  • Предполагая, что его Linux не Windows, работает PHP.

И цитирование: http://php.net/manual/en/function.mkdir.php

bool mkdir (строка $ pathname [ int $ mode = 0777 [ bool $ recursive = FALSE [ ресурс $ context]]])

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

итак, мы можем просто кодировать:

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

Объяснение:

Нам не нужно передавать какой-либо параметр или проверять, существует ли папка, или даже передавать параметр mode, если в этом нет необходимости; по следующим причинам:

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

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

Протестировано на PHP7, Production Server, Linux

0
WPDev

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

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

$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
Aditya Malviya

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

$dirpath = "path/to/dir";
$mode = "0777";
is_dir($dirpath) || mkdir($dirpath, $mode, true);
0
simhumileco
if (!is_dir('path_directory')) {
    @mkdir('path_directory');
}
0
Mayur Kukadiya