問題描述

我遇到了幾個情況,WordPress 安裝與 Bluehost,我遇到錯誤與我的 WordPress 主題,因為上傳資料夾 wp-content/uploads 不存在。

顯然,Bluehost cPanel WP 安裝程式不會建立此資料夾,儘管 HostGator 。

所以我需要新增程式碼到我的主題檢查資料夾,否則建立它。

最佳解決方案

嘗試這個:

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

請注意,0777 已經是目錄的預設模式,並且可能仍然被當前的 umask 修改。

次佳解決方案

這是丟失的一塊。你需要在 mkdir 呼叫中將’recursive’ 標誌作為第三個引數 (布林值為 true),如下所示:

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

第三種解決方案

有一些比較普遍的東西,因為它出現在谷歌。雖然細節更具體,但這個問題的標題更為普遍。

/**
 * 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 。

可以透過提供一個停止級別進行改進,因此如果超出使用者資料夾或某些內容並透過包括許可權,它將失敗。

第四種方案

這樣的幫助函式呢?

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

第五種方案

遞迴建立目錄路徑:

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

受到 Python os.makedirs()的啟發

第六種方案

更快的建立資料夾的方式:

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

第七種方案

在 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;
}

第八種方案

我需要一個登入網站相同的東西。我需要建立一個帶有兩個變數的目錄。 $目錄是我要用使用者許可證編號建立另一個 sub-folder 的主資料夾。

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

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。