디렉토리가 존재하는지 어떻게 확인합니까? “is_dir”,“file_exists”또는 둘 다?


329

디렉토리가 없으면 디렉토리를 만들고 싶습니다.

is_dir그 목적을 위해 충분히 사용 하고 있습니까?

if ( !is_dir( $dir ) ) {
    mkdir( $dir );       
}

아니면 결합해야 is_dirfile_exists?

if ( !file_exists( $dir ) && !is_dir( $dir ) ) {
    mkdir( $dir );       
} 

3
부울 연산자 OR은 AND 여야하며 PHP에서는 &&로 작성됩니다.
Ivo Renkema

15
@IvoRenkema PHP는 or/ and외에 ||/ 도 지원합니다 &&.
Camilo Martin

1
&&파일이 존재하지 않으면 ( !file_exists($dir) == true) 디렉토리가 아니기 때문에 여기서 연산자 는 쓸모 가 없습니다. 그리고 파일이 존재 하면 반환 !is_dir($dir)되지 않고 연산자가 단락 되어 검사되지 않습니다 . !file_exists($dir)false&&
부울 _ 유형

4
내 생각에 연산자는 OR이어야합니다.
Mojtaba

&&이 나를 위해 완벽하게 작동에
FABBRj

답변:


220

둘 다 Unix 시스템에서 true를 반환합니다. Unix에서는 모든 것이 디렉토리를 포함한 파일입니다. 그러나 그 이름이 사용되는지 테스트하려면 두 가지를 모두 확인해야합니다. 디렉토리 이름 'foo'를 작성하지 못하게하는 'foo'라는 이름의 일반 파일이있을 수 있습니다.


37
is_writable도 확인하는 것을 잊지 마세요
Drewdin

10
@Drewdin 부모님을 확인하고 싶 is_writable습니까?
Matthew Scharley

133
$dirname = $_POST["search"];
$filename = "/folder/" . $dirname . "/";

if (!file_exists($filename)) {
    mkdir("folder/" . $dirname, 0777);
    echo "The directory $dirname was successfully created.";
    exit;
} else {
    echo "The directory $dirname exists.";
}

46
메아리가 말한 것…
kay-SE는 사악하다

13
그것은 포스트 입력을 취하고 그대로 사용하는 것을 고려하고, 0777 dir을 만들고, 전혀 안전하지 않다; P
sEver

2
더 심각한 것은 $ dirname이 삭제되고 권한이 0755로 설정 될 수 있다는 것입니다. 일부 .htaccess 지시문에 추가하십시오. OWASP에 대한 추가 권장 사항이 있습니다. owasp.org
James P.

# The following directives force the content-type application/octet-stream # and force browsers to display a download dialog for non-image files. # This prevents the execution of script files in the context of the website: #ForceType application/octet-stream Header set Content-Disposition attachment <FilesMatch "(?i)\.(gif|jpe?g|png)$"> ForceType none Header unset Content-Disposition </FilesMatch> # The following directive prevents browsers from MIME-sniffing the content-type. # This is an important complement to the ForceType directive above: Header set X-Content-Type-Options nosniff
James P.

7
사용할 때 mkdir-왜 '$ filename'을 전달하지 않았습니까?
Howdy_McGee

17

경로가 존재하는 경우 realpath ()가 유효성을 검사하는 가장 좋은 방법 일 수 있다고 생각합니다 http://www.php.net/realpath

다음은 함수 예입니다.

<?php
/**
 * Checks if a folder exist and return canonicalized absolute pathname (long version)
 * @param string $folder the path being checked.
 * @return mixed returns the canonicalized absolute pathname on success otherwise FALSE is returned
 */
function folder_exist($folder)
{
    // Get canonicalized absolute pathname
    $path = realpath($folder);

    // If it exist, check if it's a directory
    if($path !== false AND is_dir($path))
    {
        // Return canonicalized absolute pathname
        return $path;
    }

    // Path/folder does not exist
    return false;
}

동일한 기능의 짧은 버전

<?php
/**
 * Checks if a folder exist and return canonicalized absolute pathname (sort version)
 * @param string $folder the path being checked.
 * @return mixed returns the canonicalized absolute pathname on success otherwise FALSE is returned
 */
function folder_exist($folder)
{
    // Get canonicalized absolute pathname
    $path = realpath($folder);

    // If it exist, check if it's a directory
    return ($path !== false AND is_dir($path)) ? $path : false;
}

출력 예

<?php
/** CASE 1 **/
$input = '/some/path/which/does/not/exist';
var_dump($input);               // string(31) "/some/path/which/does/not/exist"
$output = folder_exist($input);
var_dump($output);              // bool(false)

/** CASE 2 **/
$input = '/home';
var_dump($input);
$output = folder_exist($input);         // string(5) "/home"
var_dump($output);              // string(5) "/home"

/** CASE 3 **/
$input = '/home/..';
var_dump($input);               // string(8) "/home/.."
$output = folder_exist($input);
var_dump($output);              // string(1) "/"

용법

<?php

$folder = '/foo/bar';

if(FALSE !== ($path = folder_exist($folder)))
{
    die('Folder ' . $path . ' already exist');
}

mkdir($folder);
// Continue do stuff

2
이 문제를 겪는 사람이라면 realpath가 실행될 때 폴더를 캐시한다고 생각하므로 한 번 실행하면 폴더가 제거되고 다시 실행하면 false를 반환하지 않을 수 있습니다.
Jase

2
file_exists도
Sebas

7

문제가있는 두 번째 변형은 이미 동일한 이름의 파일이 있지만 디렉토리가 아닌 !file_exists($dir)경우을 반환 false하고 폴더를 만들지 않으므로 오류 "failed to open stream: No such file or directory"가 발생 하기 때문에 확인되지 않습니다 . 윈도우에서 '파일'과 '폴더'유형의 차이가 필요하므로 사용,이 file_exists()is_dir()예를 들어, 같은 시간에 :

if (file_exists('file')) {
    if (!is_dir('file')) { //if file is already present, but it's not a dir
        //do something with file - delete, rename, etc.
        unlink('file'); //for example
        mkdir('file', NEEDED_ACCESS_LEVEL);
    }
} else { //no file exists with this name
    mkdir('file', NEEDED_ACCESS_LEVEL);
}

3
$year = date("Y");   
$month = date("m");   
$filename = "../".$year;   
$filename2 = "../".$year."/".$month;

if(file_exists($filename)){
    if(file_exists($filename2)==false){
        mkdir($filename2,0777);
    }
}else{
    mkdir($filename,0777);
}

1
전체 경로를 확인할 수 있으며 존재하지 않는 경우 mkdir 재귀로 작성하십시오. if (! file_exists ($ filename2)) {mkdir ($ filename2, 0777, true); } 또한 $ filename이 존재하지 않으면 코드가 전체 경로를 만들지 않습니다 ...
Niels R.

3
$save_folder = "some/path/" . date('dmy');

if (!file_exists($save_folder)) {
   mkdir($save_folder, 0777);
}

3
chmod 777을 설정하는 것은 좋은 생각이 아닙니다. 폴더에는 755가 충분합니다.
Oldskool

2

0777 이후에 추가

<?php
    $dirname = "small";
    $filename = "upload/".$dirname."/";

    if (!is_dir($filename )) {
        mkdir("upload/" . $dirname, 0777, true);
        echo "The directory $dirname was successfully created.";
        exit;
    } else {
        echo "The directory $dirname exists.";
    }
     ?>

1

둘 다 확인하는 대신 할 수 있습니다 if(stream_resolve_include_path($folder)!==false). 속도느리지 만 한 번에 두 마리의 새를 죽입니다.

또 다른 옵션은 단순히 무시하는 것입니다 E_WARNING, 아니 사용 @mkdir(...);하지만, 그 일을하기 전에 특정 오류 핸들러를 등록하여 (즉, 간단하게, 단지 디렉토리가 이미 존재 가능한 모든 경고를 포기하기 때문)

namespace com\stackoverflow;

set_error_handler(function($errno, $errm) { 
    if (strpos($errm,"exists") === false) throw new \Exception($errm); //or better: create your own FolderCreationException class
});
mkdir($folder);
/* possibly more mkdir instructions, which is when this becomes useful */
restore_error_handler();


1

이것은 오래되었지만 여전히 주제적인 질문입니다. 테스트 중인 디렉토리에 또는 파일 이 있는지 is_dir()또는 file_exists()기능 으로 테스트하십시오. 각 디렉토리에는 다음 파일이 포함되어야합니다....

is_dir("path_to_directory/.");    

0

이것이 내가하는 방법입니다

if(is_dir("./folder/test"))
{
  echo "Exist";
}else{
  echo "Not exist";
}

이전 질문에 대답 할 때 답변이 어떻게 도움이되는지 설명하는 컨텍스트, 특히 이미 답변이 허용 된 질문에 대한 설명을 포함하면 다른 StackOverflow 사용자에게 훨씬 유용합니다. 좋은 답변을 작성하는 방법을 참조하십시오 .
David Buck

0

경로가 디렉토리인지 확인하는 방법은 다음과 같습니다.

function isDirectory($path) {
    $all = @scandir($path);
    return $all !== false;
}

참고 : 존재하지 않는 경로의 경우 false를 반환하지만 UNIX / Windows에서는 완벽하게 작동합니다.

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