यदि कोई निर्देशिका मौजूद है तो मैं कैसे जांच करूं? "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
बूलियन ऑपरेटर या होना चाहिए और पीएचपी में इसे &&
Ivo Renkema

15
@IvoRenkema PHP भी समर्थन करता है or/ andइसके अलावा ||/ &&
कैमिलो मार्टिन

1
ऑपरेटर &&यहां अप्रयुक्त है, क्योंकि, यदि फ़ाइल मौजूद नहीं है ( !file_exists($dir) == true), तो निश्चित रूप से यह एक निर्देशिका नहीं है। और अगर फ़ाइल मौजूद है, तो !is_dir($dir)जाँच नहीं की जाएगी, क्योंकि !file_exists($dir)वापस आ जाएगी falseऔर &&ऑपरेटर शॉर्ट-सर्किट है
Boolean_Type

4
मेरे विचार में, ऑपरेटर OR होना चाहिए।
मोजतबा

&& के साथ यह मेरे लिए पूरी तरह से काम करता है
FABBRj

जवाबों:


220

दोनों यूनिक्स सिस्टम पर सच होंगे - यूनिक्स में सब कुछ निर्देशिकाओं सहित एक फाइल है। लेकिन यह जांचने के लिए कि क्या नाम लिया गया है, आपको दोनों की जांच करनी चाहिए। 'फू' नाम की एक नियमित फाइल हो सकती है, जो आपको निर्देशिका नाम 'फू' बनाने से रोकेगी।


37
यह भी देखना न भूलें कि क्या is_writable भी है
Drewdin

10
@ ड्र्यूडेन आप माता-पिता की जांच करना is_writableचाहेंगे कि क्या आप नहीं करेंगे?
मैथ्यू शार्ले

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
बहुत गूंज क्या कहता है ...
- एसई बुराई है

13
यह मानते हुए कि यह पोस्ट इनपुट लेता है और इसका उपयोग करता है, साथ ही 0777 dir बनाता है, यह पूरी तरह से सुरक्षित नहीं है। P
sEver

2
अधिक गंभीरता से, $ dirname को सैनिटाइज़ किया जा सकता है और अनुमति 0755 पर सेट की जा सकती है। कुछ .htaccess निर्देशों में जोड़ें। OWASP पर कुछ और सिफारिशें हैं: owasp.org
जेम्स पी।

# 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
जेम्स पी।

7
जब आप उपयोग करते हैं mkdir- तो आपने '$ फ़ाइलनाम' पास क्यों नहीं किया?
होवडी_मसीजी

17

मुझे लगता है कि अगर कोई रास्ता 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
जो कोई भी इस पार आता है, मेरा मानना ​​है कि जब यह चलता है तो रियलपथ कैश फोल्डर करता है, इसलिए यदि इसे एक बार चलाया जाता है, तो उसके बाद फ़ोल्डर को हटा दिया जाता है, यह फिर से चलने पर गलत नहीं हो सकता है।
जस

2
इसलिए हालांकि file_exists करता है
Sebas

7

प्रश्न पोस्ट में दूसरा संस्करण ठीक नहीं है, क्योंकि, यदि आपके पास पहले से ही एक ही नाम वाली फ़ाइल है, लेकिन यह निर्देशिका नहीं है, !file_exists($dir)तो वापस आ जाएगी false, फ़ोल्डर नहीं बनाया जाएगा, इसलिए त्रुटि "failed to open stream: No such file or directory"उत्पन्न हो जाएगी। विंडोज में 'फ़ाइल' और 'फ़ोल्डर' प्रकारों के बीच अंतर होता है, इसलिए उपयोग करने की आवश्यकता होती है file_exists()और is_dir()उसी समय, पूर्व के लिए:

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); } इसके अलावा, यदि आप $ फ़ाइलनाम मौजूद नहीं है, तो आप कभी भी पूर्ण पथ नहीं बनाएंगे ...
Niels R।


2

0777 के बाद सही जोड़ें

<?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)। यह धीमा है लेकिन एक शॉट में दो पक्षियों को मार देता है।

एक अन्य विकल्प केवल उपयोग करने से नहीं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

मुझे भी ऐसा ही संदेह था, लेकिन PHP डान्स देखें:

https://www.php.net/manual/en/function.file-exists.php

https://www.php.net/manual/en/function.is-dir.php

आप देखेंगे कि दोनों गुणों में है।

यदि फ़ाइल नाम मौजूद है और रिटर्न एक निर्देशिका है, तो F_SE अन्यथा है, रिटर्न मान is_dir है।


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

नोट: यह गैर-मौजूद पथ के लिए भी गलत वापस आ जाएगा, लेकिन UNIX / Windows के लिए पूरी तरह से काम करता है

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