ডিরেক্টরি উপস্থিত থাকলে আমি কীভাবে চেক করব? "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
বুলিয়ান অপারেটর বা ও হওয়া উচিত এবং পিএইচপি-তে এটি && হিসাবে লেখা হয়েছে
আইভো রেঙ্কেমা

15
@IvoRenkema পিএইচপি এছাড়াও সমর্থন or/ andব্যতীত ||/ &&
ক্যামিলো মার্টিন

1
অপারেটর &&, কারণ কোন অস্তিত্ব নেই ফাইলটি আছে (এখানে unuseful হয় !file_exists($dir) == true), নিশ্চিত এটি একটি ডিরেক্টরির নয়। এবং যদি ফাইল বিদ্যমান থাকে তবে !is_dir($dir)তা পরীক্ষা করা হবে না, কারণ !file_exists($dir)ফিরে আসবে falseএবং &&অপারেটর শর্ট সার্কিট
বুলিয়ান_প্রকার

4
আমার দৃষ্টিতে অপারেটরটি ওআর হওয়া উচিত।
মোজতবা

&& এর সাথে এটি আমার পক্ষে নিখুঁতভাবে কাজ করে
FABBRj

উত্তর:


220

উভয়ই ইউনিক্স সিস্টেমে সত্য ফিরে আসবে - ইউনিক্সে সমস্ত কিছুই ডিরেক্টরি সহ একটি ফাইল। তবে নামটি নেওয়া হয়েছে কিনা তা পরীক্ষা করার জন্য আপনার উভয়টি পরীক্ষা করা উচিত। 'Foo' নামে একটি নিয়মিত ফাইল থাকতে পারে, যা আপনাকে ডিরেক্টরি নাম 'ফু' তৈরি করতে বাধা দেয়।


37
is_writable এছাড়াও কিনা তা ভুলে যাবেন না
ড্রিউডউইন

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 দির করে তোলে, প্রিওলি মোটেও নিরাপদ নয়; পি
সেভার

2
আরও গুরুতরভাবে, ir dirname স্যানিটাইজ করা যেতে পারে এবং অনুমতি 0755 এ সেট করা যেতে পারে that কিছু সংক্ষিপ্ত নির্দেশিকাতে যোগ করুন। OWASP-
জেমস পি

# 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- আপনি কেবল 'ফাইলের নাম' পাস করেন নি কেন?
হাওডি_এমসিজি 14'14

17

আমি মনে করি যদি কোনও পথ বিদ্যমান থাকে তবে রিয়েলপথ () হতে পারে যাচাই করার সেরা উপায় http://www.php.net/relpath

এখানে একটি উদাহরণ ফাংশন:

<?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
ফাইল-অ্যাসিস্টগুলি যদিও রয়েছে
সেবাস

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
আপনি পুরো পাথটি পরীক্ষা করতে পারেন এবং যদি এটির অস্তিত্ব না থাকে তবে এটিকে এমকেডির পুনরাবৃত্ত করে তৈরি করুন: যদি (! File_exists ($ filename2)) {mkdir ($ filename2, 0777, সত্য); } এছাড়াও, code ফাইলের
নামটি


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

আমারও একই সন্দেহ ছিল, তবে পিএইচপি ডকুমেন্টটি দেখুন:

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

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

আপনি দেখতে পাবেন যে-দিরের দুটি বৈশিষ্ট্য রয়েছে।

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


1

এটি একটি পুরানো, কিন্তু এখনও সাময়িক প্রশ্ন। পরীক্ষার অধীনে ডিরেক্টরিতে বা ফাইলের উপস্থিতির জন্য কেবল is_dir()বা file_exists()ফাংশন দিয়ে পরীক্ষা করুন। প্রতিটি ডিরেক্টরিতে এই ফাইলগুলি থাকা উচিত:...

is_dir("path_to_directory/.");    

0

আমি এইভাবে করি

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

কোনও পুরানো প্রশ্নের উত্তর দেওয়ার সময়, আপনার উত্তরটি অন্যান্য স্ট্যাকওভারফ্লো ব্যবহারকারীদের কাছে অনেক বেশি কার্যকর হবে যদি আপনি আপনার উত্তরটি কীভাবে সহায়তা করে তা ব্যাখ্যা করার জন্য কিছু প্রসঙ্গ অন্তর্ভুক্ত করে, বিশেষত ইতিমধ্যে স্বীকৃত উত্তর রয়েছে এমন একটি প্রশ্নের জন্য। দেখুন: আমি কীভাবে ভাল উত্তর লিখব
ডেভিড বাক

0

কোনও পথটি ডিরেক্টরি কিনা তা পরীক্ষা করার একটি উপায় অনুসরণ করা যেতে পারে:

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

দ্রষ্টব্য: এটি অ-অযৌক্তিক পাথের জন্যও মিথ্যা ফিরিয়ে দেবে, তবে ইউনিক্স / উইন্ডোজের জন্য পুরোপুরি কাজ করে

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