यदि यह पहले से मौजूद नहीं है तो एक फ़ोल्डर बनाएँ


642

WordPress के साथ साथ स्थापित करता है मैं कुछ मामलों आई है Bluehost जहां मैं अपने वर्डप्रेस विषय के साथ त्रुटियों का सामना करना पड़ा है, क्योंकि अपलोड फ़ोल्डर wp-content/uploadsमौजूद नहीं थे।

जाहिरा तौर पर Bluehost cPanel वर्डप्रेस इंस्टॉलर इस फ़ोल्डर को नहीं बनाता है, हालांकि HostGator करता है।

इसलिए मुझे अपने विषय में कोड जोड़ने की आवश्यकता है जो फ़ोल्डर की जांच करता है और इसे अन्यथा बनाता है।


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

जवाबों:


1227

Mkdir का उपयोग करके यह प्रयास करें :

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

ध्यान दें कि 0777निर्देशिका के लिए पहले से ही डिफ़ॉल्ट मोड है और अभी भी वर्तमान umask द्वारा संशोधित किया जा सकता है।


11
आप 'पुनरावर्ती' ध्वज से चूक गए - सतीश का उत्तर देखें।
फ्रेंकोइस बुर्जुआ

118
is_dir () फ़ाइल_एक्सिस्ट्स की तुलना में थोड़ा तेज़ है, ()
pliashkou

43
@YuryPliashkou हाँ शायद, लेकिन यह काम नहीं करता है अगर वहाँ पहले से ही उस नाम के साथ एक फ़ाइल है
गंबू 3

4
यहाँ सवाल: तो अगर पथ / /, is_dir में 'डाइरेक्टरी' नाम की कोई फ़ाइल होती है, तो क्या वह सही होगा, लेकिन file_exists गलत होगा?
इगोर एल

8
file_exists- जाँचता है कि फ़ाइल या निर्देशिका मौजूद है या नहीं is_file- बताता है कि फ़ाइल नाम एक नियमित फ़ाइल है is_dir- बताता है कि फ़ाइल नाम एक निर्देशिका है
TarranJones

137

यहाँ लापता टुकड़ा है। आपको इस तरह के mkdir कॉल में तीसरे तर्क (बूलीयन ट्रू) के रूप में 'पुनरावर्ती' ध्वज को पास करना होगा :

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

8
बूलियन 3 तर्क होने के कारण 'पुनरावर्ती' ध्वजtrue
अहानबेस्कैड

66

कुछ और अधिक सार्वभौमिक क्योंकि यह Google पर आता है। जबकि विवरण अधिक विशिष्ट हैं, इस प्रश्न का शीर्षक अधिक सार्वभौमिक है।

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

यह एक पथ लेगा, संभवतः अनुपचारित निर्देशिकाओं की एक लंबी श्रृंखला के साथ, और एक निर्देशिका को तब तक जारी रखेगा जब तक कि यह किसी मौजूदा निर्देशिका के लिए न हो जाए। फिर यह उस निर्देशिका में अगली निर्देशिका बनाने का प्रयास करेगा, और तब तक जारी रखेगा जब तक कि यह सभी निर्देशिकाएं न बना लें। यह सफल होने पर वापस लौटता है।

एक रोक स्तर प्रदान करके सुधार किया जा सकता है, इसलिए यह विफल हो जाता है यदि यह उपयोगकर्ता फ़ोल्डर या कुछ और अनुमतियों को पार करता है।


@ फ़ेज़ मुझे लाइन $ रिटर्न = createPath ($ 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);
}

यदि उस मार्ग पर 'निर्देशिका' नाम की कोई फ़ाइल है, तो यह त्रुटि देगा।
गनी ओजसन

23

निर्देशिका पथ का पुन: निर्माण करें:

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

पायथन द्वारा प्रेरित os.makedirs()


11

वर्डप्रेस के भीतर भी बहुत आसान फ़ंक्शन wp_mkdir_p है जो पुन: एक निर्देशिका संरचना बना देगा।

संदर्भ के लिए स्रोत: -

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
त्रुटि दमन के साथ, यह जाँचने की कोई आवश्यकता नहीं है कि निर्देशिका मौजूद है
neoascetic

4
उन्हें दबाने की तुलना में त्रुटियों को संभालना बेहतर है। यदि यह विफल हो जाता है, तो आप कभी नहीं जान पाएंगे कि यह क्यों है, और इसे शोध करना होगा
टिम ओगिल्वी

अत्यधिक समवर्ती / बहुपरत वातावरण में त्रुटि को दबाने की सलाह दी जाती है। एक दौड़ की स्थिति हो सकती है जिसमें दो या अधिक धागे is_dir () का मूल्यांकन करेंगे और निर्देशिका बनाने का प्रयास करेंगे। पहला धागा बिना किसी समस्या के इसे बनाने में सक्षम होगा, लेकिन दूसरे सूत्र ऐसा करने में विफल रहेंगे, क्योंकि निर्देशिका पहले से मौजूद है। वास्तव में विफल निर्देशिका निर्माण से बचने के लिए आपको @mkdir () को कॉल करने के बाद निर्देशिका के अस्तित्व की जांच करनी चाहिए।
टोबेन

2

आप भी आजमा सकते हैं:

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

2

एक फ़ोल्डर बनाने के लिए अगर यह पहले से मौजूद नहीं है

प्रश्न के वातावरण को देखते हुए।

  • वर्डप्रेस।
  • वेबहोस्टिंग सर्वर।
  • इसके लिनक्स को नहीं विंडोज को PHP मानते हुए।

और से उद्धृत: http://php.net/manual/en/function.mkdir.php

बूल mkdir (स्ट्रिंग $ pathname [, int $ मोड = 0777 [, bool $ recursive = FALSE [, संसाधन $ संदर्भ]]])

मैनुअल का कहना है कि केवल आवश्यक पैरामीटर है $pathname!

तो, हम बस कोड कर सकते हैं:

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

स्पष्टीकरण:

जब तक फ़ोल्डर मौजूद न हो या मोड मोड पैरामीटर पास न हो, तब तक हमें कोई पैरामीटर या जाँच नहीं करनी होगी; निम्नलिखित कारणों के लिए:

  • कमांड 0755 अनुमति (साझा होस्टिंग फ़ोल्डर की डिफ़ॉल्ट अनुमति) या 0777 कमांड डिफ़ॉल्ट के साथ फ़ोल्डर बनाएगा।
  • modePHP को चलाने वाले Windows होस्टिंग पर ध्यान नहीं दिया जाता है ।
  • mkdirयदि फ़ोल्डर मौजूद है, तो पहले से ही कमांड ने चेकर में निर्माण किया है; इसलिए हमें केवल वापसी की जाँच करने की आवश्यकता है। और इसकी त्रुटि नहीं है, इसकी चेतावनी केवल है, और चेतावनी डिफ़ॉल्ट रूप से सर्वर की मेजबानी में अक्षम है।
  • गति के अनुसार, यह तेज़ है अगर चेतावनी अक्षम है।

यह सवाल पर गौर करने और बेहतर या सबसे इष्टतम समाधान का दावा नहीं करने का सिर्फ एक और तरीका है।

PHP7, उत्पादन सर्वर, लिनक्स पर परीक्षण किया गया



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

PHPStorm (PHP निरीक्षण के साथ) बिल्कुल यही सुझाव देता है ;-) btw। आप बाहरी को भीतर में विलीन कर सकते हैं: if (! is_dir (...) &&! mkdir (...) &&! is_dir ((...)) ...
aProgger

-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 सही अनुमति हैं क्योंकि हम आम तौर पर सर्वर पर अपलोड किए जाने की इच्छा नहीं रखते हैं।

सत्य पुनरावर्ती संपत्ति को सही या गलत पर सेट करने के लिए तीसरा पैरामीटर है। यह मार्गनाम में निर्दिष्ट नेस्टेड निर्देशिकाओं के निर्माण की अनुमति देता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.