Bir dizinin mevcut olup olmadığını nasıl kontrol ederim? “İs_dir”, “file_exists” veya her ikisi mi?


329

Zaten mevcut değilse bir dizin oluşturmak istiyorum.

Bu is_diramaç için kullanmak yeterli mi?

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

Ya da birleştirmek gerekir is_dirile file_exists?

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

3
Boole operatörü VEYA VE olmalıdır ve PHP'de &&
Ivo Renkema

15
@IvoRenkema PHP de or/ andyanı sıra ||/ destekler &&.
Camilo Martin

1
Operatör &&burada !file_exists($dir) == trueişe yaramaz, çünkü dosya yoksa ( ), kesinlikle bir dizin olmadığından. Ve dosya varsa, !is_dir($dir)kontrol edilmez, çünkü !file_exists($dir)geri döner falseve &&operatör kısa devre yapar .
Boolean_Type

4
Benim görüşüme göre, operatör OR olmalıdır.
Mojtaba

&& ile bu benim için mükemmel çalışıyor
FABBRj

Yanıtlar:


220

Her ikisi de Unix sistemlerinde true değerini döndürür - Unix'te her şey dizinler dahil bir dosyadır. Ancak bu adın alınıp alınmadığını test etmek için her ikisini de kontrol etmelisiniz. 'Foo' dizin adı oluşturmanızı engelleyecek 'foo' adlı normal bir dosya olabilir.


37
ayrıca is_writable olup olmadığını kontrol etmeyi unutmayın
Drewdin

10
@Drewdin ebeveynini kontrol etmek is_writableisterdin değil mi?
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
Yankının söylediği çok şey…
kay - SE kötüdür

13
post girdisini alır ve olduğu gibi kullanır, ayrıca 0777 dir, prolly o kadar da güvenli değildir; P
sEver

2
Daha ciddisi, $ dirname temizlenebilir ve izin 0755 olarak ayarlanabilir. Buna bazı .htaccess yönergeleri ekleyin. OWASP'de
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
Kullandığınız zaman mkdir- neden sadece '$ filename' iletmediniz?
Howdy_McGee

17

Ben bir yol varsa realpath () doğrulamak için en iyi yol olabilir düşünüyorum http://www.php.net/realpath

İşte bir örnek fonksiyon:

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

Aynı işlevin kısa versiyonu

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

Çıktı örnekleri

<?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) "/"

kullanım

<?php

$folder = '/foo/bar';

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

mkdir($folder);
// Continue do stuff

2
Buna rastlayan herkes için, realpath'in klasörleri çalıştırırken önbelleğe aldığına inanıyorum, bu yüzden bir kez çalıştırılırsa, klasör bundan sonra kaldırılır, tekrar çalıştırılırsa false döndürmeyebilir.
Jase

2
file_exists de öyle
Sebas

7

Soru yazısında ikinci varyant iyi değil, çünkü aynı ada sahip bir dosyanız varsa, ancak bir dizin değilse, !file_exists($dir)geri dönecek false, klasör oluşturulmaz, bu nedenle hata "failed to open stream: No such file or directory"oluşacaktır. Windows'ta 'dosya' ve 'klasör' türleri arasında bir fark vardır, bu yüzden kullanmanız gerekir file_exists()ve is_dir()aynı zamanda örn .:

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
Tam yolu kontrol edebilirsiniz ve yoksa mkdir özyinelemeli olarak oluşturun: if (! File_exists ($ filename2)) {mkdir ($ filename2, 0777, true); } Ayrıca, $ filename yoksa kodunuz asla tam yolu oluşturmayacaktır ...
Niels R.

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

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

3
Chmod 777'nin ayarlanması asla iyi bir fikir değildir. 755 klasörler için yeterlidir.
Oldskool

2

0777'den sonra doğru ekle

<?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

Bothkisini de kontrol etmek yerine, yapabilirsin if(stream_resolve_include_path($folder)!==false). Daha yavaş ama bir atışta iki kuşu öldürüyor.

Başka bir seçenek basitçe görmezden olduğunu E_WARNING, değil kullanarak @mkdir(...);, ancak bunu yapmadan önce belirli bir hata işleyicisi kaydederek (yani basitçe, sadece dizin zaten bir var tüm olası uyarıları feragat çünkü):

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

Bu eski ama yine de güncel bir soru. Test edilen dizinde veya dosyasının varlığını is_dir()veya file_exists()işleviyle test etmeniz yeterlidir. Her dizin şu dosyaları içermelidir:...

is_dir("path_to_directory/.");    

0

Ben böyle yapıyorum

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

Eski bir soruyu cevaplarken, özellikle de zaten kabul edilmiş bir cevabı olan bir soru için, cevabınızın nasıl yardımcı olduğunu açıklamak için bir bağlam eklediyseniz, cevabınız diğer StackOverflow kullanıcıları için çok daha yararlı olacaktır. Bakınız: İyi bir cevabı nasıl yazarım .
David Buck

0

Bir yolun dizin olup olmadığını kontrol etmenin bir yolu aşağıdaki olabilir:

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

NOT: Varolmayan yol için de yanlış döndürür, ancak UNIX / Windows için mükemmel çalışır

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.