폴더가 없으면 만듭니다


642

업로드 폴더 가 없기 때문에 WordPress 테마에 오류가 발생 하는 Bluehost 와 함께 WordPress를 설치하는 경우 가 있습니다 wp-content/uploads.

BlueGhost cPanel WordPress 설치 프로그램은 HostGator와 달리이 폴더를 작성하지 않습니다 .

따라서 폴더를 확인하고 다른 방법으로 만드는 코드를 테마에 추가해야합니다.


7
if (!file_exists('path/to/directory')) { mkdir('path/to/directory', 0777, true); }
나는 가장 어리석은 사람이다

답변:


1227

mkdir을 사용하여 이것을 시도하십시오 :

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

참고 0777이미 디렉토리에 대한 기본 모드입니다 여전히 현재의 umask에 의해 수정 될 수 있습니다.


11
'재귀 적'플래그를 놓쳤습니다. Satish의 답변을 참조하십시오.
Francois Bourgeois

118
is_dir ()이 file_exists ()보다 약간 빠릅니다.
pliashkou

43
@YuryPliashkou 그래 아마도 그 이름을 가진 파일 이 있다면 작동하지 않습니다 .
Gumbo

4
여기에 질문 : 그래서 path / to에 'directory'라는 파일이 있으면 is_dir은 true를 반환하지만 file_exists는 false를 반환합니까?
Igor L.

8
file_exists— 파일 또는 디렉토리가 있는지 확인 — 파일 is_file이름이 일반 파일 is_dir인지를 나타 냅니다 — 파일 이름이 디렉토리인지를 나타
냅니다

137

여기 누락 된 부분이 있습니다. 다음 과 같이 mkdir 호출 에서 '재귀 적'플래그를 세 번째 인수 (부울 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;
}

이것은 생성되지 않은 긴 디렉토리 체인으로 경로를 취하고 기존 디렉토리에 도달 할 때까지 하나의 디렉토리로 계속 올라갑니다. 그런 다음 해당 디렉토리에 다음 디렉토리를 작성하고 모든 디렉토리가 작성 될 때까지 계속합니다. 성공하면 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()도우미가 방수 도우미 기능 을 수행하는지 확인하는 보너스 포인트입니다 .
Pekka

@를 사용하여 오류를 억제하면 성능이 저하됩니다. 더 나은 이미 검보처럼 존재하지 않는 그것을 확인
사이먼

1
오류 억제에 관계없이 첫 번째 예에서는 -1로 기울어졌습니다. 두 번째는 훨씬 나아서 첫 번째는 무의미합니다.
저스틴 존슨

한 줄에 코드를 넣는 것만으로는 코드를 읽기가 어렵습니다. 허용되는 답변이 훨씬 명확합니다.
MikeKulls

27

빠른 폴더 생성 방법 :

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

해당 경로에 'directory'라는 파일이 있으면 오류가 발생합니다.
구니 오즈 산

23

재귀 적으로 디렉토리 경로를 작성하십시오.

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

파이썬의 영감 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

로그인 사이트에도 같은 것이 필요합니다. 두 가지 변수로 디렉토리를 만들어야했습니다. $ 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

4
오류 억제 기능을 사용하면 디렉토리가 존재
하는지

4
오류를 억제하는 것보다 오류를 처리하는 것이 좋습니다. 이것이 실패하면, 당신은 이것으로부터 이유를 알 수 없으며, 그것을 연구해야 할 것입니다
Tim Ogilvy

동시 / 멀티 스레드 환경에서는 오류를 억제하는 것이 좋습니다. 둘 이상의 스레드가 is_dir ()을 false로 평가하고 디렉토리를 작성하려고하는 경쟁 조건이 발생할 수 있습니다. 첫 번째 스레드는 아무런 문제없이 만들 수 있지만 디렉토리가 이미 존재하기 때문에 다른 스레드는 실패합니다. 실제로 실패한 디렉토리 작성이 누락되지 않도록하려면 @mkdir ()을 다시 호출 한 후 디렉토리가 있는지 확인해야합니다.
tobain

2

당신은 또한 시도 할 수 있습니다 :

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

2

폴더가없는 경우 폴더를 만들려면

질문의 환경을 고려합니다.

  • 워드 프레스.
  • 웹 호스팅 서버.
  • Linux가 PHP를 실행하는 Windows가 아니라고 가정합니다.

그리고 인용 : 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
}
?>

설명:

매개 변수를 전달하거나 폴더가 있는지 확인하거나 필요하지 않은 경우 모드 매개 변수를 전달할 필요도 없습니다. 다음과 같은 이유로 :

  • 이 명령은 0755 권한 (공유 호스팅 폴더의 기본 권한) 또는 0777 명령의 기본값으로 폴더를 만듭니다.
  • modePHP를 실행 하는 Windows 호스팅 에서는 무시됩니다 .
  • mkdir폴더가 존재하면 명령이 이미 검사기에서 빌드되었습니다. 따라서 반환 값 만 확인해야합니다. True | False; 오류가 아니라 경고 만 있으며 경고는 기본적으로 서버 호스팅에서 비활성화되어 있습니다.
  • 속도에 따라 경고가 비활성화되면 더 빠릅니다.

이것은 질문을 조사하고 더 좋고 가장 최적의 솔루션을 요구하지 않는 또 다른 방법입니다.

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 검사와 함께)은이 제안을 정확하게 제공합니다. ;-) btw. 외부를 내부에 병합 할 수 있습니다 : if (! is_dir (...) &&! mkdir (...) &&! is_dir (...)) ...
aProgger

-1

수락 된 답변은 효과가 있지만 권한 때문에 올바른 솔루션이 아닙니다. 0777 권한은 모든 사람이 디렉토리에 액세스 / 읽기 / 쓰기를 할 수있게합니다. 이것은 우리가 웹 서버에서 디렉토리를 업로드하기 위해 원하는 것이 아닙니다. 다음은 제안 된 정확하고 완전한 솔루션입니다.

$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로 설정하기위한 세 번째 매개 변수입니다. 경로 이름에 지정된 중첩 디렉토리를 만들 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.