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


641

Bluehostを使用したWordPressのインストールで、uploadsフォルダーwp-content/uploadsが存在しないためにWordPressテーマでエラーが発生したいくつかのケースに遭遇しました。

どうやらお申し込みのcPanelのにWordPressのインストーラは、このフォルダを作成しませんHostgatorのはありません。

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


7
if (!file_exists('path/to/directory')) { mkdir('path/to/directory', 0777, true); }
私はほとんど愚かな人です

回答:


1228

mkdirを使用してこれを試してください:

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

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


11
「再帰」フラグを逃しました-サティッシュの回答を参照してください。
フランソワブルジョワ

118
is_dir()はfile_exists()よりも少し高速です
pliashkou 2013

43
@YuryPliashkouそうかもしれませんが、その名前のファイルがすでに存在する場合は機能しません。
ガンボ2013

4
ここで質問:パス/ toに 'directory'という名前のファイルがある場合、is_dirはtrueを返しますが、file_existsはfalseを返しますか?
Igor L.

8
file_exists—ファイルまたはディレクトリが存在する is_fileかどうかを確認します—ファイル名が通常のファイルであるis_dirかどうかを確認します —ファイル名がディレクトリであるかどうかを確認します
TarranJones

137

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

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

8
「再帰的」フラグはブール3番目の引数true
ahnbizcad

66

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

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

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


@phazei $ return = createPath($ prev_path);という行があるため、未定義の関数が呼び出されます。
Battousai 2016年

ありがとう@phazei :)
Alex

58

次のようなヘルパー関数についてはどうでしょう。

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

4
を削除@して適切なis_dirチェックで置き換える場合、私の賛成票はあなたのものです:) is_writable()防水ヘルパー関数の親ディレクトリかどうかをチェックするボーナスポイント。
ペッカ

@を使用してエラーを抑制すると、パフォーマンスが低下します。Gumboのようにまだ存在していないことを確認することをお勧めします
Simon

1
エラー抑制に関係なく、私は最初の例では-1に傾けています。2つ目は非常に優れているため、1つ目は無意味です。
Justin Johnson

これを1行に置くだけではコードを読むのは困難です。受け入れられた答えははるかに明確です。
MikeKulls 2013年

27

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

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

そのパスに「ディレクトリ」という名前のファイルがある場合、これはエラーになります。
Guney Ozsan、

23

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

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

Pythonに触発された os.makedirs()


11

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

6

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

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

5

これは、エラーを抑制しない最新のソリューションです。

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

3

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

2
if (!is_dir('path_directory')) {
    @mkdir('path_directory');
}

3
エラー抑制?どうして?
canadiancreed 2013年

4
エラー抑制を使用すると、ディレクトリが存在することを確認するには必要ありません
neoascetic

4
エラーを抑制するよりも、エラーを処理する方が適切です。これが失敗した場合、その理由がわからないため、調査する必要があります
Tim Ogilvy

高度な並行/マルチスレッド環境では、エラーを抑制することをお勧めします。2つ以上のスレッドがis_dir()をfalseと評価し、ディレクトリを作成しようとする競合状態が発生する可能性があります。最初のスレッドは問題なく作成できますが、ディレクトリがすでに存在するため、他のスレッドは作成に失敗します。実際に失敗したディレクトリの作成を見逃さないようにするには、@ mkdir()を再度呼び出した後、ディレクトリの存在を確認する必要があります。
tobain 2017

2

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

$dirpath = "path/to/dir";
$mode = "0777";
is_dir($dirpath) || mkdir($dirpath, $mode, true);

2

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

質問の環境を考慮します。

  • ワードプレス。
  • ウェブホスティングサーバー。
  • PHPを実行しているWindowsではなくLinuxを想定しています。

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

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

マニュアルでは、必須パラメーターは$pathname

したがって、単純にコーディングできます。

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

説明:

必要がない限り、パラメーターを渡したり、フォルダーが存在するかどうかを確認したり、モードパラメーターを渡したりする必要はありません。次の理由により:

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

これは、質問を検討するためのもう1つの方法であり、より良いまたは最適なソリューションを主張するものではありません。

PHP7、本番サーバー、Linuxでテスト済み


2
$upload = wp_upload_dir();
$upload_dir = $upload['basedir'];
$upload_dir = $upload_dir . '/newfolder';
if (! is_dir($upload_dir)) {
   mkdir( $upload_dir, 0700 );
}

2

私たちは常にコードをモジュール化する必要があり、私は同じチェックを以下に記述しました...最初にディレクトリをチェックします。ディレクトリがない場合は、ディレクトリを作成します。

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

1

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

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

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

mkdir()の詳細はこちら

ここに完全なコード:

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

0

どうぞ。

if (!is_dir('path/to/directory')) {
    if (!mkdir('path/to/directory', 0777, true) && !is_dir('path/to/directory')) {
        throw new \RuntimeException(sprintf('Directory "%s" was not created', 'path/to/directory'));
    }
}

PHPStorm(PHPインスペクション付き)は、まさにこの提案を提供します;-)ところで。外側のifを内側にマージできます:if(!is_dir(...)&&!mkdir(...)&&!is_dir(...))...
aProgger

-1

受け入れられた回答は機能しますが、権限のために適切なソリューションではありません。0777権限により、全員がディレクトリにアクセス/読み取り/書き込みできます。これは、Webサーバーのアップロードディレクトリに必要なものではありません。ここに提案された正しい完全なソリューションがあります。

$path_to_directory = 'path/to/directory';
if (!file_exists($path_to_directory) && !is_dir($path_to_directory)) {
    mkdir($path_to_directory, 0644, true);
}

0644は、通常、サーバーにアップロードされてそこで実行されることを望まないため、アップロードディレクトリの適切な権限です。

trueは、再帰プロパティをtrueまたはfalseに設定するための3番目のパラメーターです。パス名で指定されたネストされたディレクトリを作成できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.