Zaten mevcut değilse bir klasör oluşturun


642

Yüklemeler klasörü olmadığı için WordPress temamla ilgili hatayla karşılaştığım Bluehost ile WordPress yüklemeleri ile birkaç durumla karşılaştım wp-content/uploads.

Görünüşe göre Bluehost cPanel WordPress yükleyicisi, HostGator'ın oluşturduğu halde bu klasörü oluşturmuyor .

Bu yüzden klasörü kontrol eder ve başka türlü oluşturur benim tema kodu eklemeniz gerekir.


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

Yanıtlar:


1227

Mkdir kullanarak şunu deneyin :

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

Not 0777zaten dizinleri için varsayılan moddur ve hala geçerli Umask tarafından değiştirilebilir.


11
'Özyinelemeli' bayrağı kaçırdınız - Satish'in cevabına bakın.
Francois Bourgeois

118
is_dir (), file_exists () 'den biraz daha hızlı
pliashkou

43
@YuryPliashkou Evet belki, ama bu ada sahip bir dosya zaten çalışmıyor .
Gumbo

4
burada soru: yani / to dizininde 'dizin' adında bir dosya olsaydı, is_dir doğru, ancak file_exists yanlış döndürürdü?
Igor L.

8
file_exists- Bir dosya veya dizinin mevcut is_fileolup is_dirolmadığını kontrol eder - Dosya
adının

137

İşte eksik parça. 'Özyinelemeli' bayrağı mkdir çağrısında üçüncü argüman olarak (boolean true) şu şekilde geçirmeniz gerekir :

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

8
'özyinelemeli' bayrak boole 3. bağımsız değişkenitrue
ahnbizcad

66

Google'da bu yana biraz daha evrensel bir şey geliyor. Ayrıntılar daha spesifik olmakla birlikte, bu sorunun başlığı daha evrenseldir.

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

Bu, muhtemelen uzun bir oluşturulmamış dizin zinciri ile bir yol alacaktır ve mevcut bir dizine ulaşana kadar bir dizine çıkmaya devam edecektir. Daha sonra bu dizinde bir sonraki dizini oluşturmaya ve tüm dizinleri oluşturana kadar devam etmeye çalışır. Başarılı olursa doğru döndürür.

Kullanıcı klasörü veya başka bir şeyin ötesine geçerse başarısız olur ve izinler ekleyerek bir durdurma düzeyi sağlayarak geliştirilebilir.


@phazei $ return = createPath ($ prev_path) satırı nedeniyle tanımsız işleve bir çağrı alıyorum;
Battousai

Teşekkürler @phazei :)
Alex

58

Peki böyle bir yardımcı fonksiyon hakkında:

function makeDir($path)
{
     $ret = mkdir($path); // use @mkdir if you want to suppress warnings/errors
     return $ret === true || is_dir($path);
}

trueDizin başarılı bir şekilde oluşturulmuşsa veya zaten mevcutsa ve dizin oluşturulamadıysa geri döner false.

Daha iyi bir alternatif budur (herhangi bir uyarı vermemelidir):

function makeDir($path)
{
     return is_dir($path) || mkdir($path);
}

4
Bunu @doğru bir is_dirdenetim ile kaldırır ve değiştirirseniz , benim oyum sizindir :) Üst dizinin is_writable()su geçirmez bir yardımcı işlevi olup olmadığını kontrol etmek için bonus puan .
Pekka

Hataları bastırmak için @ kullanmak bir performans isabeti. Daha şimdiden bamya gibi yok bunu kontrol etmek
Simon

1
Hata bastırmadan bağımsız olarak, ilk örnek için -1'e eğilimliyim. İkincisi çok daha iyidir, birincisi anlamsızdır.
Justin Johnson

Bu sadece 1 satır üzerine koymak için kodu okumak zordur. Kabul edilen cevap daha açıktır.
13:38

27

Klasör oluşturmanın daha hızlı yolu:

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

Bu yolda 'dizin' adında bir dosya varsa bu hata verir.
Güney Ozsan

23

Yinelenen dizin yolu oluşturun:

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

Python'dan esinlenerek os.makedirs()


11

WordPress içinde, bir dizin yapısını tekrar tekrar oluşturacak çok kullanışlı wp_mkdir_p işlevi de var .

Referans kaynağı: -

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

Bir giriş sitesi için de aynı şeye ihtiyacım var. İki değişkenli bir dizin oluşturmam gerekiyordu. $ Dizini, kullanıcı lisans numarası ile başka bir alt klasör oluşturmak istediğim ana klasördür.

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

Bu, hata bastırma olmadan en güncel çözümdür:

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

3

file_existsVS is_dirprobleminden kaçınmak istiyorsanız , buraya bakmanızı öneririm

Bu çalıştı ve eğer sadece dizin oluşturur dizin yok . Bu ada sahip bir dosya olması umurumda değil.

/* 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
Hata bastırma? Neden?
canadiancreed

4
Hata bastırma ile, dizinin var olup olmadığını kontrol etmeye gerek yoktur
neoascetic

4
hataları bastırmaktan daha iyidir. Bu başarısız olursa, bunun nedenini asla bilemezsiniz ve araştırmanız gerekir
Tim Ogilvy

Eşzamanlı / çok iş parçacıklı ortamlarda hatayı bastırmanız önerilir. İki veya daha fazla iş parçacığının is_dir () öğesini false olarak değerlendireceği ve dizini oluşturmaya çalışacağı bir yarış durumu oluşabilir. İlk iş parçacığı sorunsuz bir şekilde oluşturabilir, ancak dizin zaten mevcut olduğu için diğer iş parçacıkları bunu yapamaz. Gerçekten başarısız bir dizin oluşturmayı kaçırmamak için, mkdir () çağrısından sonra dizinin varlığını tekrar kontrol etmelisiniz.
tobain

2

Ayrıca deneyebilirsiniz:

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

2

Zaten mevcut değilse bir klasör oluşturmak için

Sorunun çevresini göz önünde bulundurarak.

  • WordPress.
  • Webhosting Sunucusu.
  • Linux'un Windows çalıştıran PHP olmadığını varsayarsak.

Ve alıntı: http://php.net/manual/en/function.mkdir.php

bool mkdir (dize $ yoladı [, int $ mode = 0777 [, bool $ recursive = FALSE [, kaynak $ bağlam]]])

Manual, gerekli tek parametrenin $pathname!

yani, biz sadece kodlayabilirsiniz:

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

Açıklama:

Herhangi bir parametre iletmemiz veya klasörün var olup olmadığını kontrol etmemiz ve hatta gerekmedikçe mode modu parametresini geçmemiz gerekmiyor; Aşağıdaki sebeplerden dolayı:

  • Komut, klasörü 0755 izni (Paylaşılan barındırma klasörü varsayılan izni) veya komutun varsayılan değeri 0777 ile oluşturur.
  • modePHP çalıştıran Windows Hosting üzerinde yok sayılır .
  • Zaten mkdirklasör varsa komutun denetleyicisi vardır; bu yüzden sadece dönüşü kontrol etmeliyiz Doğru | Yanlış; ve bu bir hata değil, yalnızca bir uyarıdır ve Barındırma sunucularında Uyarı varsayılan olarak devre dışıdır.
  • Hıza göre, uyarı devre dışı bırakılırsa bu daha hızlıdır.

Bu, soruyu incelemenin ve daha iyi veya en uygun çözümü istememenin başka bir yoludur.

PHP7, Production Server, Linux üzerinde test edildi


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

2

Kodumuzu her zaman modülerize etmeliyiz ve aynı yazıyı aşağıda yazdım ... Önce dizini kontrol ederiz, eğer dizin yoksa dizin yaratırız.

$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

Öncelikle dizinin mevcut olup olmadığını kontrol etmeniz gerekir file_exists('path_to_directory')

Sonra mkdir(path_to_directory)bir dizin oluşturmak için kullanın

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

Mkdir () hakkında daha fazla bilgi burada

Tam kodu burada:

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

0

Hadi bakalım.

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 Denetimleri ile) tam olarak bu öneriyi verir ;-) btw. Eğer varsa, iç içine dış birleştirebilirsiniz: (!! is_dir (...) && mkdir (...) && is_dir (...)) eğer ...
aProgger

-1

Kabul edilen cevap işe yarıyor, ancak izinler nedeniyle doğru çözüm değil. 0777 izinleri herkesin dizine erişmesine / okumasına / yazmasına izin verir. Web sunucusuna dizin yüklemek için istediğimiz bu değil. İşte önerilen doğru ve eksiksiz çözüm.

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

0644, yükleme dizini için doğru izinlerdir, çünkü genellikle sunucuya yüklenmiş olanların orada yürütülmesini istemiyoruz.

true, özyinelemeli özelliği true veya false olarak ayarlamak için üçüncü parametredir. Yol adında belirtilen iç içe dizinlerin oluşturulmasına izin verir.

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.