যদি একটি ফোল্ডার ইতিমধ্যে বিদ্যমান না থাকে তা তৈরি করুন


641

আমি ব্লুহোস্টের সাথে ওয়ার্ডপ্রেস ইনস্টল করে কয়েকটি ক্ষেত্রে চলেছি যেখানে আমার ওয়ার্ডপ্রেস থিমটিতে আমি ত্রুটির মুখোমুখি হয়েছি কারণ আপলোডগুলির ফোল্ডারটি wp-content/uploadsউপস্থিত ছিল না।

স্পষ্টতই ব্লুহোস্ট সিপ্যানেল ওয়ার্ডপ্রেস ইনস্টলার এই ফোল্ডারটি তৈরি করে না, যদিও হোস্টগেটর তা করে।

সুতরাং আমার থিমটিতে আমার এমন কোড যুক্ত করা দরকার যা ফোল্ডারটি পরীক্ষা করে এবং অন্যথায় এটি তৈরি করে।


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

উত্তর:


1226

এমকেডির ব্যবহার করে এটি ব্যবহার করে দেখুন :

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

দ্রষ্টব্য যে ডিরেক্টরিগুলির 0777জন্য ইতিমধ্যে ডিফল্ট মোড এবং এখনও বর্তমান উমাস্ক দ্বারা সংশোধিত হতে পারে।


11
আপনি 'পুনরাবৃত্ত' পতাকাটি মিস করেছেন - সতীশের উত্তর দেখুন।
ফ্রাঙ্কোইস বুর্জোয়া

118
is_dir () file_exists () এর তুলনায় কিছুটা দ্রুত
pliashkou

43
@ ইউরিপ্লিয়্যাশকৌ হ্যাঁ, তবে ইতিমধ্যে সেই নামের কোনও ফাইল থাকলে তা কার্যকর হয় না ।
গম্বো

4
এখানে প্রশ্ন: সুতরাং যদি / ডিরেক্টরিতে 'ডিরেক্টরি' নামে একটি ফাইল থাকত, তবে কি_সির সত্য প্রত্যাবর্তন করবে, তবে ফাইল_অস্তাদীরা মিথ্যা ফিরে আসবে?
ইগোর এল।

8
file_exists- কোনও ফাইল বা ডিরেক্টরি বিদ্যমান is_fileকিনা তা যাচাই করে - ফাইলের নাম একটি নিয়মিত ফাইল is_dirকিনা তা
ফাইলনামটি

137

এখানে নিখোঁজ টুকরো। আপনার এমকিডির কলটিতে তৃতীয় আর্গুমেন্ট (বুলিয়ান ট্রু) হিসাবে 'পুনরাবৃত্ত' পতাকাটি পাস করতে হবে :

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

8
'পুনরাবৃত্ত' পতাকাটি বুলিয়ান তৃতীয় যুক্তিtrue
আহ্নবিজক্যাড

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

এটি সম্ভবত অব্রাহিত ডিরেক্টরিগুলির একটি দীর্ঘ চেইন সহ একটি পথ নেবে এবং এটি কোনও ডিরেক্টরি ডিরেক্টরিতে না পাওয়া পর্যন্ত একটি ডিরেক্টরিতে যেতে থাকবে। তারপরে এটি সেই ডিরেক্টরিতে পরবর্তী ডিরেক্টরি তৈরি করার চেষ্টা করবে এবং সমস্ত ডিরেক্টরি তৈরি না হওয়া পর্যন্ত চালিয়ে যাবে। এটি সফল হলে সত্য ফিরে আসে।

স্টপিং লেভেল সরবরাহ করে উন্নত করা যায় তাই এটি যদি ব্যর্থ হয় তবে এটি ব্যবহারকারীর ফোল্ডার বা কোনও কিছুর বাইরে চলে গেলে এবং অনুমতিগুলি অন্তর্ভুক্ত করে।


@ ফিজেই আমি $ রিটার্ন = ক্রিয়েপথ ($ prev_path) লাইনের কারণে অপরিজ্ঞাত ফাংশনে একটি কল পাই;
বটসৌসাই

ধন্যবাদ @phazei :)
অ্যালেক্স

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()জলরোধী সহায়ক ফাংশনের জন্য পিতামহিত ডিরেক্টরি কিনা তা পরীক্ষা করার জন্য বোনাস পয়েন্ট ।
পেক্কা

ত্রুটিগুলি দমন করতে @ ব্যবহার করা একটি পারফরম্যান্স হিট। এটি ইতিমধ্যে গাম্বোর মতো উপস্থিত নেই যাচাই করা আরও ভাল
সাইমন

1
ত্রুটি দমন যাই হোক না কেন, আমি প্রথম উদাহরণের জন্য -1 এর দিকে ঝুঁকছি। দ্বিতীয়টি এতটাই ভাল যে প্রথমটি অর্থহীন।
জাস্টিন জনসন

কোডটি কেবল 1 লাইনে রাখার পয়েন্টের জন্য এটি পড়া কঠিন। গৃহীত উত্তরটি আরও পরিষ্কার।
মাইককুলস

26

ফোল্ডার তৈরি করার দ্রুত উপায়:

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

সেই পথে 'ডিরেক্টরি' নামে একটি ফাইল থাকলে এটি ত্রুটি দেয়।
Guney Ozsan

23

পুনরাবৃত্তভাবে ডিরেক্টরি পাথ তৈরি করুন:

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

পাইথনের দ্বারা অনুপ্রাণিত os.makedirs()


11

ওয়ার্ডপ্রেসের মধ্যে খুব সহজেই ডাব্লুপিপিএমকেডির_পি ফাংশন রয়েছে যা একটি ডিরেক্টরি কাঠামো পুনরাবৃত্তভাবে তৈরি করবে create

রেফারেন্সের জন্য উত্স: -

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

লগইন সাইটের জন্য আমারও একই জিনিস দরকার। আমার দুটি ভেরিয়েবল সহ একটি ডিরেক্টরি তৈরি করতে হবে। $ ডিরেক্টরিটি হ'ল মূল ফোল্ডার যেখানে আমি ব্যবহারকারী লাইসেন্স নম্বর সহ অন্য একটি সাব-ফোল্ডার তৈরি করতে চেয়েছিলাম।

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_existsভিএস 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
ভুল দমন? কেন?
কানাডিয়ান

4
ত্রুটি দমন সহ, ডিরেক্টরিটি বিদ্যমান রয়েছে তা যাচাই করার দরকার নেই
নব্যাসটিক

4
ত্রুটিগুলি দমন করার চেয়ে তাদের পরিচালনা করা ভাল। যদি এটি ব্যর্থ হয় তবে আপনি কখনই তা জানতে পারবেন না এবং এটি নিয়ে গবেষণা করতে হবে
টিম ওগিলভি

অত্যন্ত একযোগে / বহুবিবাহিত পরিবেশে ত্রুটিটি দমন করার পরামর্শ দেওয়া হয়। একটি দৌড় শর্ত দেখা দিতে পারে যেখানে দুটি বা ততোধিক থ্রেড is_dir () টি মিথ্যা হিসাবে মূল্যায়ন করবে এবং ডিরেক্টরি তৈরির চেষ্টা করবে। প্রথম থ্রেডটি কোনও সমস্যা ছাড়াই এটি তৈরি করতে সক্ষম হবে, তবে অন্যান্য থ্রেডগুলি এটি করতে ব্যর্থ হবে, কারণ ডিরেক্টরিটি ইতিমধ্যে বিদ্যমান। প্রকৃতভাবে ব্যর্থ ডিরেক্টরি ডিরেক্টরি তৈরি না করা এড়াতে আপনার আবার @mkdir () এ কল করার পরে ডিরেক্টরিটির অস্তিত্ব পরীক্ষা করা উচিত।
টোবাইন

2

আপনিও চেষ্টা করতে পারেন:

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

2

যদি একটি ফোল্ডার ইতিমধ্যে বিদ্যমান না থাকে তা তৈরি করতে

প্রশ্নের পরিবেশ বিবেচনা করা।

  • ওয়ার্ডপ্রেস।
  • ওয়েবহোস্টিং সার্ভার।
  • উইন্ডোজ পিএইচপি চালিত উইন্ডোজ নয় লিনাক্স ধরে।

এবং থেকে উদ্ধৃত: http://php.net/manual/en/function.mkdir.php

বুল এমকিডির (স্ট্রিং $ পথনাম [

ম্যানুয়াল বলে যে কেবলমাত্র প্রয়োজনীয় প্যারামিটারটিই হ'ল $pathname!

সুতরাং, আমরা কেবল কোড করতে পারি:

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

ব্যাখ্যা:

আমাদের কোনও প্যারামিটার পাস করতে হবে না বা ফোল্ডারটি উপস্থিত আছে কিনা তা যাচাই করতে হবে না বা প্রয়োজন অনুযায়ী মোড প্যারামিটারটিও পাস করতে হবে না; নিম্নলিখিত কারণে:

  • কমান্ডটি 0755 অনুমতি (ভাগ করা হোস্টিং ফোল্ডারের ডিফল্ট অনুমতি) বা 0777 কমান্ডের ডিফল্ট দিয়ে ফোল্ডার তৈরি করবে।
  • modeউইন্ডোজ হোস্টিং চলমান পিএইচপি এ উপেক্ষা করা হয় ।
  • mkdirফোল্ডার উপস্থিত থাকলে ইতিমধ্যে কমান্ডটি চেকার তৈরি করেছে; সুতরাং আমাদের কেবল রিটার্নটি পরীক্ষা করতে হবে | মিথ্যা; এবং এটি কোনও ত্রুটি নয়, এটি কেবল একটি সতর্কতা এবং সতর্কতা ডিফল্টরূপে হোস্টিং সার্ভারগুলিতে অক্ষম।
  • গতি অনুসারে, সতর্কতা অক্ষম করা থাকলে এটি আরও দ্রুত।

এটি প্রশ্নটির দিকে নজর দেওয়ার এবং আরও ভাল বা সর্বোত্তম সমাধানের দাবি না করার আরও একটি উপায়।

লিনাক্স, পিএইচপি 7, প্রোডাকশন সার্ভারে পরীক্ষিত



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'));
    }
}

পিএইচপিএসটারম (পিএইচপি পরিদর্শন সহ) ঠিক এই পরামর্শ দেয় ;-) বিটিডব্লিউ। আপনি যদি অভ্যন্তরীণ হয়ে যান তবে আপনি বাইরেরটিকে একীভূত করতে পারেন: যদি (! is_dir (...) && mkdir (...) &&!
is_dir

-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 হ'ল আপলোড ডিরেক্টরিগুলির জন্য সঠিক অনুমতি কারণ আমরা সাধারণত সার্ভারে আপলোড করতে চাই না সেখানে চালানো হোক।

সত্যটি সত্য বা মিথ্যাতে পুনরাবৃত্ত সম্পত্তি নির্ধারণের জন্য তৃতীয় পরামিতি। এটি পথের নামগুলিতে নির্দিষ্ট নেস্টেড ডিরেক্টরি তৈরির অনুমতি দেয় allows

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.