web-dev-qa-db-ja.com

フォルダが存在しない場合は作成します。

私は、アップロードフォルダwp-content/uploadsが存在していなかったために私のWordPressテーマでエラーが発生した、BluehostでのWordPressインストールでいくつかのケースに遭遇しました。

明らかにBluehost cPanel WPインストーラはこのフォルダを作成しませんが、HostGatorは作成します。

そのため、フォルダをチェックし、それ以外の場合は作成するコードをテーマに追加する必要があります。

567
Scott B

これを試して:

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

0777はすでにディレクトリのデフォルトモードであり、現在のumaskによって変更される可能性があることに注意してください。

1109
Gumbo

これが足りない部分です。次のようにmkdir呼び出しで3番目の引数として「recursive」フラグを渡す必要があります(ブール値true)。

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

これはグーグルに登場するので、もう少し普遍的な何か。詳細はより具体的ですが、この質問のタイトルはより普遍的です。

/** 
 * 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;
}

これは、おそらく未作成のディレクトリの長い連鎖でパスをたどり、それが既存のディレクトリに到達するまで1つのディレクトリを上り続けます。それから、そのディレクトリの次のディレクトリを作成しようとし、それがすべてのディレクトリを作成するまで続けます。成功すればtrueを返します。

停止レベルを設定することで改善できます。ユーザーフォルダなどを超えた場合やアクセス許可を含めることで失敗します。

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を返します。

より良い 代替はこれです(警告を出すべきではありません):

function makeDir($path)
{
     return is_dir($path) || mkdir($path);
}
52
AndiDog

フォルダを作成するためのより速い方法:

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

再帰的にディレクトリパスを作成します。

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

Pythonの 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

ログインサイトにも同じことが必要です。私は2つの変数でディレクトリを作成する必要がありました。 $ディレクトリは、ユーザーのライセンス番号を使用して別のサブフォルダーを作成したいメインフォルダーです。

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

フォルダが存在しない場合は作成する

質問の環境を考える。

  • WordPress.
  • Webホスティングサーバ。
  • LinuxがPHPを実行しているWindowsではないと仮定します。

そして引用元: http://php.net/manual/en/function.mkdir.php

ブール mkdir(文字列$パス名[、int $モード= 0777 [、ブール$再帰= FALSE [、リソース$コンテキスト]]])

Manualによると、必須のパラメータは$pathnameだけです。

だから、私たちは単にコーディングすることができます:

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

説明:

パラメータを渡したり、フォルダが存在するかどうかをチェックしたり、必要でなければモードパラメータを渡したりする必要はありません。以下の理由による。

  • このコマンドは、0755権限(共有ホスティングフォルダのデフォルト権限)または0777コマンドのデフォルト権限でフォルダを作成します。
  • modeは、 PHP を実行しているWindowsホスティングでは無視されます。
  • フォルダが存在する場合、mkdirコマンドはすでにチェッカーに組み込まれています。したがって、戻り値のみをチェックする必要がありますTrue | False。それはエラーではなく、警告のみであり、警告はホスティングサーバーではデフォルトで無効になっています。
  • 速度によっては、これは警告が無効になっていると速くなります。

これは、問題を検討するための単なる別の方法であり、より優れた、または最適な解決策を主張することではありません。

PHP 7、運用サーバー、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
A H M

あなたも試すことができます:

$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

最初に、ディレクトリが存在するかどうかを確認する必要がありますfile_exists('path_to_directory')

次に、mkdir(path_to_directory)を使用してディレクトリを作成します

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

mkdir()here の詳細

完全なコードはこちら:

$structure = './depth1/depth2/depth3/';
if (!file_exists($structure)) {
    mkdir($structure);
}
0
Nasir Khan