ディレクトリが存在するかどうかを確認するにはどうすればよいですか?「is_dir」、「file_exists」、またはその両方ですか?


329

ディレクトリがまだない場合は作成します。

is_dirその目的のために十分に使用していますか?

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

それとも組み合わせる必要がis_dirありfile_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&&演算子は短絡であるため、チェックされません。
Boolean_Type 2016年

4
私の見解では、演算子はORである必要があります。
Mojtaba

&&でこれは私にとって完璧に機能します
FABBRj

回答:


220

Unixシステムではどちらもtrueを返します-Unixでは、ディレクトリを含むすべてがファイルです。ただし、その名前が使用されているかどうかをテストするには、両方を確認する必要があります。「foo」という名前の通常のファイルがある可能性があります。これにより、「foo」というディレクトリ名を作成できなくなります。


37
is_writableかどうかを確認することも忘れないでください
Drewdin

10
@Drewdin親をチェックしたいと思いis_writableませんか?
Matthew Scharley、2011年

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
エコーが言うことのほとんど…
ええ-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 2014年

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、2015年

2
file_existsもそうです
Sebas '10

7

問題の投稿の2番目のバリアントは問題です。これは、同じ名前のファイルがすでにあるが、それがディレクトリではない場合、!file_exists($dir)が返されfalse、フォルダーが作成されないため、エラー"failed to open stream: No such file or directory"が発生するためです。Windowsでは「ファイル」と「フォルダ」タイプの違いは、必要そう使用し、そこにあるfile_exists()is_dir()EXのために、同時に:

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 2015年

2

0777の後にtrueを追加

<?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)速度遅いですが、1発で2羽の鳥を殺します。

別のオプションは、を無視することです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ユーザーにとって、特に既に回答が受け入れられている質問の回答がはるかに役立つでしょう。参照:良い答えを書くにはどうすればよいですか
デビッドバック

0

パスがディレクトリかどうかを確認する方法は次のとおりです。

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

注:存在しないパスに対してもfalseを返しますが、UNIX / Windowsに対しては完全に機能します

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