এতে ফাইল যুক্ত ডিরেক্টরি মুছবেন?


246

আমি অবাক হই, কোনও ডিরেক্টরিতে এর সমস্ত ফাইল সহ মুছে ফেলার সহজ উপায় কী?

আমি rmdir(PATH . '/' . $value);কোনও ফোল্ডার মুছতে ব্যবহার করছি , তবে এর মধ্যে যদি ফাইল থাকে তবে আমি কেবল এটি মুছতে পারি না।



2
হ্যাঁ, ঠিক এই প্রশ্নের উত্তর।
টিমদেব

শুধু নোট করতে চান। আমি একাধিক ফাইল তৈরি করেছি এবং যদি প্রক্রিয়া চলাকালীন কিছু ত্রুটি ঘটে তবে পূর্বে নির্মিত ফাইলগুলি মুছতে হবে। ফাইলগুলি তৈরি করার সময়, ব্যবহার করতে ভুলে গেছেন fclose($create_file);এবং যখন মুছবেন, পেয়েছেন Warning: unlink(created_file.xml): Permission denied in...। সুতরাং এই জাতীয় ত্রুটিগুলি এড়াতে অবশ্যই তৈরি ফাইলগুলি বন্ধ করতে হবে।
অ্যান্ডিস

উত্তর:


382

আজকাল কমপক্ষে দুটি বিকল্প উপলব্ধ।

  1. ফোল্ডারটি মোছার আগে, এর সমস্ত ফাইল এবং ফোল্ডারগুলি মুছুন (এবং এর অর্থ পুনরাবৃত্তি!)। এখানে একটি উদাহরণ:

    public static function deleteDir($dirPath) {
        if (! is_dir($dirPath)) {
            throw new InvalidArgumentException("$dirPath must be a directory");
        }
        if (substr($dirPath, strlen($dirPath) - 1, 1) != '/') {
            $dirPath .= '/';
        }
        $files = glob($dirPath . '*', GLOB_MARK);
        foreach ($files as $file) {
            if (is_dir($file)) {
                self::deleteDir($file);
            } else {
                unlink($file);
            }
        }
        rmdir($dirPath);
    }
  2. এবং আপনি যদি 5.2+ ব্যবহার করে থাকেন তবে আপনি নিজেই পুনরাবৃত্তিটি প্রয়োগ না করে এটি করার জন্য একটি রিকার্সআইটিটর ব্যবহার করতে পারেন:

    $dir = 'samples' . DIRECTORY_SEPARATOR . 'sampledirtree';
    $it = new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS);
    $files = new RecursiveIteratorIterator($it,
                 RecursiveIteratorIterator::CHILD_FIRST);
    foreach($files as $file) {
        if ($file->isDir()){
            rmdir($file->getRealPath());
        } else {
            unlink($file->getRealPath());
        }
    }
    rmdir($dir);

11
আপনার দ্বিতীয় বাস্তবায়ন কিছুটা বিপজ্জনক: এটি বিন্দু ( .এবং ..) অনুসন্ধান করে না এবং এটি সমাধানের পথটিকে মুছে দেয়, আসলটি নয়।
অ্যালিক্স অ্যাক্সেল

9
সামান্য অ্যাড-অন :-) গ্লোব () .htaccess এর মতো ফাইলগুলিকে সমর্থন করে না। আমি কেসিফিন্ডার (সিকেইডিটর প্লাগইন) দ্বারা তৈরি ডিরেক্টরিগুলি পরিষ্কার করতে ফাংশনটি ব্যবহার করেছি যা .htaccess এবং .thumbs (ফাইল + ফোল্ডার) উভয়ই উত্পন্ন করে। পরিবর্তে আমি scandirফোল্ডার তালিকা পেতে ফাংশন ব্যবহার । আপনি নিশ্চিত করুন যে আপনি 'ফিল্টার করুন'। এবং ফলাফলের তালিকা থেকে '..' ফাইলগুলি।
জোশুয়া - পেন্ডো

25
আপনি যখন ওএসে পাঠানোর জন্য পাথ তৈরি করছেন তখন DIRECTORY_SEPARATOR প্রয়োজন হয় না । উইন্ডোজও ফরোয়ার্ড স্ল্যাশ গ্রহণ করবে। এটি ওএস থেকেexplode() নেওয়া কোনও পথ আইংয়ের জন্য মূলত কার্যকর । alanhogan.com/tips/php/directory-separator-not-necessary
ReactiveRaven

5
এখানে অ্যালেক্স অ্যাক্সেল ব্যবহারের সাথে সাথে [স্প্লফিলিআইএনফো :: getRealPath ()] ( php.net/manual/en/splfileinfo.getrelpath.php ) ভাল ধারণা নয়। এই পদ্ধতিটি সমস্ত প্রতীকী লিঙ্কগুলিকে প্রসারিত করে, এর অর্থ টার্গেট ডিরেক্টরি থেকে একটি সিমলিংকের পরিবর্তে কোথাও একটি আসল ফাইল মোছা হবে। পরিবর্তে আপনার স্প্লফিলআইএনফো :: গেটপ্যাথনাম () ব্যবহার করা উচিত।
বিজিত

2
আমি @ বিজিতের সাথে একমত, getRealPath () এর পরিবর্তে getPathname () ব্যবহার করুন। সিমলিঙ্কগুলি পাওয়া গেলে আপনি যা প্রত্যাশা করছেন তার চেয়ে বেশি মোছা ছাড়াই এটি একই কাজ করে।
JoeMoe1984

196

আমি সাধারণত একটি ফোল্ডারে সমস্ত ফাইল মুছতে এটি ব্যবহার করি:

array_map('unlink', glob("$dirname/*.*"));

এবং তারপর আপনি করতে পারেন

rmdir($dirname);

26
এটি পুনরাবৃত্তভাবে ফোল্ডারগুলি মুছবে না; এটি কেবল তখনই কাজ করে যদি ফোল্ডারে কেবলমাত্র নিয়মিত ফাইল থাকে যার সমস্তটিরই ফাইল এক্সটেনশান থাকে।
mgnb

5
যদি কোনও পুনরাবৃত্তি প্রয়োজন না হয় এটি এখন পর্যন্ত সেরা এবং সহজ উত্তর। ধন্যবাদ!
eisbehr

2
কোনও ফোল্ডার থেকে সমস্ত ফাইল সরাতে , কেবল এক্সটেনশানযুক্তগুলি নয়, নিম্নলিখিত পদ্ধতিতে গ্লোব ব্যবহার করুন: array_map('unlink', glob("$dirname/*"));এটি এখনও আপনাকে ফোল্ডারে থাকা ডিরেক্টরিগুলি মুছতে দেয় না।
ক্রেমুয়া

নোট করুন যে এটি ডট (লুকানো) ফাইলগুলিও সরিয়ে ফেলবে।
BadHorsie

84

কোনও ডিরেক্টরিতে থাকা ফাইলগুলির সাথে এটি মুছানোর সহজতম উপায় কী?

system("rm -rf ".escapeshellarg($dir));

33
আমি আশা করি আপনি সিরিয়াস নন। $ দির হলে / কি হয়
পিক্সেল বিকাশকারী

108
@ উপরের কোডগুলির সাথে ঠিক একই রকম। তাই না?
আপনার সাধারণ অনুভূতি

7
নোট করুন, কীভাবে $dirউত্পন্ন / সরবরাহ করা হয় তার উপর নির্ভর করে আপনার নিরাপদ থাকতে এবং বাগগুলি এড়াতে কিছু অতিরিক্ত প্রাক প্রসেসিংয়ের প্রয়োজন হতে পারে। উদাহরণস্বরূপ, যদি $dirএটিতে একটি অবিরত স্থান বা আধা-কোলন থাকতে পারে তবে অনাকাঙ্ক্ষিত পার্শ্ব প্রতিক্রিয়া হতে পারে। উত্তরের মতো জিনিসগুলির উত্তরগুলির ক্ষেত্রে এটি হয় না rmdir()কারণ এটি আপনার জন্য বিশেষ অক্ষরগুলি পরিচালনা করবে।
ট্রট

5
উইন্ডোজ সংস্করণ:system('rmdir '.escapeshellarg($path).' /s /q');
সাইফার

2
@ দ্য পিক্সেল ডেফলারটি মুছে ফেলার বিষয়ে আপনার চিন্তা করা উচিত নয়, আপনি কেবল কমান্ড লাইনে স্ক্রিপ্টটি রুট হিসাবে লঞ্চ করতে চাইলে এটি কাজ করবে, কারণ ওয়েবে সমস্ত কিছু অ্যাপাচি ব্যবহারকারী হিসাবে ঘটে
বেন

49

শর্ট ফাংশন যা কাজ করে:

function deleteDir($path) {
    return is_file($path) ?
            @unlink($path) :
            array_map(__FUNCTION__, glob($path.'/*')) == @rmdir($path);
}

আমি এটি ব্যবহারের মতো ক্লাসে এটি ব্যবহার করি:

class Utils {
    public static function deleteDir($path) {
        $class_func = array(__CLASS__, __FUNCTION__);
        return is_file($path) ?
                @unlink($path) :
                array_map($class_func, glob($path.'/*')) == @rmdir($path);
    }
}

দুর্দান্ত পাওয়ার সাথে দুর্দান্ত দায়িত্ব আসে : আপনি যখন এই ফাংশনটিকে খালি মূল্য দিয়ে কল করবেন তখন এটি রুট ( /) থেকে শুরু হওয়া ফাইলগুলি মুছবে । সেফগার্ড হিসাবে আপনি পরীক্ষা করতে পারেন যে পথটি খালি আছে:

function deleteDir($path) {
    if (empty($path)) { 
        return false;
    }
    return is_file($path) ?
            @unlink($path) :
            array_map(__FUNCTION__, glob($path.'/*')) == @rmdir($path);
}

1
স্ট্যাটিকটি কাজ করে না কারণ a এটি === নাল আপনি যখন ক্লাসে কোনও স্ট্যাটিক ফাংশন বলবেন। এটি যদি কাজ করবে$this_func = array(__CLASS__, __FUNCTION__);
ম্যাট কনোলি

2
কেউ কি লাইনটি ব্যাখ্যা করতে পারেন array_map($class_func, glob($path.'/*')) == @rmdir($path)? আমি অনুমান করি যে তিনি সাবফোল্ডারগুলির মাধ্যমে পুনরাবৃত্তি করছেন, তবে == @ rmdir অংশটি কী করবে? <বুলিয়ান্সের অ্যারে> == <বুলিয়ান> কীভাবে উত্তরটি দেয়? এটি কি পুনরুদ্ধারের প্রতিটি রিটার্নের মান ডানদিকে বুলিয়ানের সমান কিনা তা পরীক্ষা করে?
আরভিমান

2
দুটি বক্তব্যকে একটি বিবৃতিতে একীভূত করার কৌশল। এটি কারণ ত্রিনিরি অপারেটরগুলি যুক্তি অনুসারে কেবল একটি বিবৃতি দেয়। array_map(...)ডিরেক্টরিতে সমস্ত ফাইল @rmdir(...)সরিয়ে দেয়, ডিরেক্টরি নিজেই সরিয়ে দেয়।
ব্লেইস

3
সতর্ক হোন! এই কার্যটি পাথটি সত্যই উপস্থিত রয়েছে কিনা তা পরীক্ষা করে না। আপনি যদি খালি যুক্তিটি পাস করেন তবে ফাংশনটি রুট থেকে শুরু হওয়া ফাইলগুলি মুছতে শুরু করবে! আপনি এই ফাংশনটি চালানোর আগে আপনার পথে একটি স্যানিটি চেক যুক্ত করুন।
তাতু উলমানেন

3
কিছু লোক তাতুর মন্তব্য দেখেনি এবং পুনরাবৃত্তভাবে মুছে ফেলা হয়েছে /, তাই আমি আমার পোস্টে সুরক্ষিত সংস্করণ যুক্ত করেছি।
ব্লাইজ করুন

22

পিএইচপি ম্যানুয়াল পৃষ্ঠায় rmdir()( http://php.net/manual/es/function.rmdir.php দেখুন ) সম্পর্কে সর্বাধিক ভোট দেওয়া মন্তব্যে দেখা গেছে , glob()ফাংশনটি লুকানো ফাইলগুলি ফেরায় না। scandir()একটি বিকল্প হিসাবে প্রদান করা হয় যা সমস্যা সমাধান করে।

সেখানে বর্ণিত অ্যালগরিদম (যা আমার ক্ষেত্রে আকর্ষণের মতো কাজ করেছিল):

<?php 
    function delTree($dir)
    { 
        $files = array_diff(scandir($dir), array('.', '..')); 

        foreach ($files as $file) { 
            (is_dir("$dir/$file")) ? delTree("$dir/$file") : unlink("$dir/$file"); 
        }

        return rmdir($dir); 
    } 
?>

আপনি কি দয়া করে is_dir ("ir dir / $ ফাইল") ব্যাখ্যা করতে পারেন - "$ dir / $ ফাইল" প্যারামিটারের সাথে দেখা হয় নি
Igor L.

আপনি কি বোঝাতে চেয়েছেন? ডিরেক্টরিতে ( $file) ডিরেক্টরিতে প্রবেশ করা ফাইলটি ডিরেক্টরি বা একটি ফাইল কিনা তা এটি পরীক্ষা করে । "$dir/$file"হিসাবে একই $dir . "/" . $file
জার্মান লেটারে

আমি সত্যই জানতাম না যে আপনি এই জাতীয় মতগুলি পরিবর্তন করতে পারেন :) থেক্স
ইগোর এল।

18

এটি একটি সংক্ষিপ্ত সংস্করণ আমার জন্য দুর্দান্ত কাজ করে

function deleteDirectory($dirPath) {
    if (is_dir($dirPath)) {
        $objects = scandir($dirPath);
        foreach ($objects as $object) {
            if ($object != "." && $object !="..") {
                if (filetype($dirPath . DIRECTORY_SEPARATOR . $object) == "dir") {
                    deleteDirectory($dirPath . DIRECTORY_SEPARATOR . $object);
                } else {
                    unlink($dirPath . DIRECTORY_SEPARATOR . $object);
                }
            }
        }
    reset($objects);
    rmdir($dirPath);
    }
}

15

আপনি সিমফনির ফাইল সিস্টেম ( কোড ) ব্যবহার করতে পারেন :

// composer require symfony/filesystem

use Symfony\Component\Filesystem\Filesystem;

(new Filesystem)->remove($dir);

তবে আমি এই পদ্ধতিটি সহ কয়েকটি জটিল ডিরেক্টরি স্ট্রাকচার মুছতে পারিনি, সুতরাং প্রথমে আপনার এটি চেষ্টা করা উচিত এটি সঠিকভাবে কাজ করছে কিনা তা নিশ্চিত করার জন্য।


আমি উইন্ডোজ নির্দিষ্ট প্রয়োগটি ব্যবহার করে উল্লিখিত ডিরেক্টরি কাঠামো মুছতে পারি:

$dir = strtr($dir, '/', '\\');
// quotes are important, otherwise one could
// delete "foo" instead of "foo bar"
system('RMDIR /S /Q "'.$dir.'"');


এবং কেবল সম্পূর্ণতার জন্য, এখানে আমার একটি পুরানো কোড রয়েছে:

function xrmdir($dir) {
    $items = scandir($dir);
    foreach ($items as $item) {
        if ($item === '.' || $item === '..') {
            continue;
        }
        $path = $dir.'/'.$item;
        if (is_dir($path)) {
            xrmdir($path);
        } else {
            unlink($path);
        }
    }
    rmdir($dir);
}

অনেক অনেক ধন্যবাদ। আপনি আমার সময় বাঁচান।
জারিফ খান

"চাকা পুনরায় উদ্ভাবন করবেন না" । আপনাকে ধন্যবাদ
কামাফেদার

9

ডিরেক্টরিটি সহ ডিরেক্টরি ডিরেক্টরিতে সমস্ত ফাইল মুছে ফেলার জন্য এখানে আপনার কাছে একটি দুর্দান্ত এবং সাধারণ পুনরাবৃত্তি রয়েছে:

function delete_dir($src) { 
    $dir = opendir($src);
    while(false !== ( $file = readdir($dir)) ) { 
        if (( $file != '.' ) && ( $file != '..' )) { 
            if ( is_dir($src . '/' . $file) ) { 
                delete_dir($src . '/' . $file); 
            } 
            else { 
                unlink($src . '/' . $file); 
            } 
        } 
    } 
    closedir($dir); 
    rmdir($src);

}

ডিরেক্টরি অনুলিপি করার জন্য পুনরাবৃত্তি উপর ভিত্তি করে ফাংশন। আপনি এখানে এই ফাংশনটি খুঁজে পেতে পারেন: পিএইচপি ব্যবহার করে কোনও ডিরেক্টরিতে সম্পূর্ণ সামগ্রীর অনুলিপি করুন


4

আমার জন্য সেরা সমাধান

my_folder_delete("../path/folder");

কোড:

function my_folder_delete($path) {
    if(!empty($path) && is_dir($path) ){
        $dir  = new RecursiveDirectoryIterator($path, RecursiveDirectoryIterator::SKIP_DOTS); //upper dirs are not included,otherwise DISASTER HAPPENS :)
        $files = new RecursiveIteratorIterator($dir, RecursiveIteratorIterator::CHILD_FIRST);
        foreach ($files as $f) {if (is_file($f)) {unlink($f);} else {$empty_dirs[] = $f;} } if (!empty($empty_dirs)) {foreach ($empty_dirs as $eachDir) {rmdir($eachDir);}} rmdir($path);
    }
}

পিএস মনে রাখবেন!
কোনও ডিরেক্টরি মুছে ফাংশন এম্পটি ভ্যালু পাস করবেন না !!! (এগুলি সর্বদা ব্যাকআপ করুন, অন্যথায় একদিন আপনি ডিজনার পেতে পারেন!)


4

এই সম্পর্কে কি:

function recursiveDelete($dirPath, $deleteParent = true){
    foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dirPath, FilesystemIterator::SKIP_DOTS), RecursiveIteratorIterator::CHILD_FIRST) as $path) {
        $path->isFile() ? unlink($path->getPathname()) : rmdir($path->getPathname());
    }
    if($deleteParent) rmdir($dirPath);
}

4

গ্লোব ফাংশন লুকানো ফাইলগুলি ফিরিয়ে দেয় না, তাই কোনও গাছ পুনরাবৃত্তভাবে মুছে ফেলার চেষ্টা করার পরে স্ক্যান্ডির আরও কার্যকর হতে পারে।

<?php
public static function delTree($dir) {
   $files = array_diff(scandir($dir), array('.','..'));
    foreach ($files as $file) {
      (is_dir("$dir/$file")) ? delTree("$dir/$file") : unlink("$dir/$file");
    }
    return rmdir($dir);
  }
?>

4

আপনি নিম্নলিখিত হিসাবে চেষ্টা করতে পারেন:

/*
 * Remove the directory and its content (all files and subdirectories).
 * @param string $dir the directory name
 */
function rmrf($dir) {
    foreach (glob($dir) as $file) {
        if (is_dir($file)) { 
            rmrf("$file/*");
            rmdir($file);
        } else {
            unlink($file);
        }
    }
}

3

আমি এটি পছন্দ করি কারণ এটি সফল হওয়ার পরেও সত্যটি প্রত্যাবর্তন করে এবং এটি ব্যর্থ হলে মিথ্যা দেয় এবং এটি একটি বাগ বাধা দেয় যেখানে খালি পথ চেষ্টা করে এবং '/ *' থেকে সমস্ত কিছু মুছতে পারে !!:

function deleteDir($path)
{
    return !empty($path) && is_file($path) ?
        @unlink($path) :
        (array_reduce(glob($path.'/*'), function ($r, $i) { return $r && deleteDir($i); }, TRUE)) && @rmdir($path);
}

3

সিমলিংকগুলি পরিচালনা করার জন্য @ বিজিতের মন্তব্য সহ আমি উত্তরটি @alcuadrado দ্বারা প্রসারিত করতে চাই। প্রথমত, getRealPath () ব্যবহার করুন। তবে তারপরে, আপনার যদি ফোল্ডারগুলির কোনও সিমলিংক থাকে তবে এটি ব্যর্থ হবে কারণ এটি কোনও লিঙ্কে rmdir কল করে চেষ্টা করবে - সুতরাং আপনার একটি অতিরিক্ত চেক প্রয়োজন।

$it = new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS);
$files = new RecursiveIteratorIterator($it, RecursiveIteratorIterator::CHILD_FIRST);
foreach($files as $file) {
    if ($file->isLink()) {
        unlink($file->getPathname());
    } else if ($file->isDir()){
        rmdir($file->getPathname());
    } else {
        unlink($file->getPathname());
    }
}
rmdir($dir);

1
প্রত্যক্ষভাবে উত্তর সম্পর্কে মন্তব্য করার মতো পর্যাপ্ত পরিমাণ আমার কাছে নেই।
ব্যবহারকারী 701152

3

ডিরেক্টরীআইটার ব্যবহার করে পূর্বের উত্তরের সমতুল্য…

function deleteFolder($rootPath)
{   
    foreach(new DirectoryIterator($rootPath) as $fileToDelete)
    {
        if($fileToDelete->isDot()) continue;
        if ($fileToDelete->isFile())
            unlink($fileToDelete->getPathName());
        if ($fileToDelete->isDir())
            deleteFolder($fileToDelete->getPathName());
    }

    rmdir($rootPath);
}


2

এটার মতো কিছু?

function delete_folder($folder) {
    $glob = glob($folder);
    foreach ($glob as $g) {
        if (!is_dir($g)) {
            unlink($g);
        } else {
            delete_folder("$g/*");
            rmdir($g);
        }
    }
}

2

লিটল বিট অ্যালকুয়াড্রাডোর কোডটি পরিবর্তন করে - globপয়েন্ট থেকে নাম সহ ফাইলগুলি দেখতে পাবে না .htaccessতাই আমি স্ক্যান্ডির ব্যবহার করি এবং স্ক্রিপ্টটি নিজেই মুছে যায় - পরীক্ষা করুন __FILE__

function deleteDir($dirPath) {
    if (!is_dir($dirPath)) {
        throw new InvalidArgumentException("$dirPath must be a directory");
    }
    if (substr($dirPath, strlen($dirPath) - 1, 1) != '/') {
        $dirPath .= '/';
    }
    $files = scandir($dirPath); 
    foreach ($files as $file) {
        if ($file === '.' || $file === '..') continue;
        if (is_dir($dirPath.$file)) {
            deleteDir($dirPath.$file);
        } else {
            if ($dirPath.$file !== __FILE__) {
                unlink($dirPath.$file);
            }
        }
    }
    rmdir($dirPath);
}

2

লিনাক্স সার্ভারের উদাহরণ: exec('rm -f -r ' . $cache_folder . '/*');


ব্যয়বহুল ভুল এড়াতে আমি সাধারণত আরএম-আরএফ চালানোর আগে $ cache_folder এ স্যানিটি চেক যুক্ত করতে চাই
glyph

1

ফোল্ডারে সমস্ত ফাইল
array_map('unlink', glob("$directory/*.*"));
মুছুন সমস্ত মুছুন * * - ফোল্ডারে ফাইল (":" এবং ".."
array_map('unlink', array_diff(glob("$directory/.*),array("$directory/.","$directory/..")))
বাদে ) এখন নিজেই ফোল্ডারটি মুছুন
rmdir($directory)


1

উপরে এই উত্তর যুক্ত করতে 2 সেন্ট , যা দুর্দান্ত বিটিডাব্লু

আপনার গ্লোব (বা অনুরূপ) ফাংশনটি ডিরেক্টরিটি স্ক্যান / পাঠ করার পরে, প্রতিক্রিয়াটি খালি নয়, তা পরীক্ষা করতে একটি শর্তযুক্ত যোগ করুন, বা একটি invalid argument supplied for foreach()সতর্কতা নিক্ষেপ করা হবে। তাই ...

if( ! empty( $files ) )
{
    foreach( $files as $file )
    {
        // do your stuff here...
    }
}

আমার সম্পূর্ণ ফাংশন (একটি অবজেক্ট পদ্ধতি হিসাবে):

    private function recursiveRemoveDirectory( $directory )
    {
        if( ! is_dir( $directory ) )
        {
            throw new InvalidArgumentException( "$directory must be a directory" );
        }

        if( substr( $directory, strlen( $directory ) - 1, 1 ) != '/' )
        {
            $directory .= '/';
        }

        $files = glob( $directory . "*" );

        if( ! empty( $files ) )
        {
            foreach( $files as $file )
            {
                if( is_dir( $file ) )
                {
                    $this->recursiveRemoveDirectory( $file );
                }
                else
                {
                    unlink( $file );
                }
            }               
        }
        rmdir( $directory );

    } // END recursiveRemoveDirectory()

1

সমাধানটি নিখুঁতভাবে কাজ করে:

function unlink_r($from) {
    if (!file_exists($from)) {return false;}
    $dir = opendir($from);
    while (false !== ($file = readdir($dir))) {
        if ($file == '.' OR $file == '..') {continue;}

        if (is_dir($from . DIRECTORY_SEPARATOR . $file)) {
            unlink_r($from . DIRECTORY_SEPARATOR . $file);
        }
        else {
            unlink($from . DIRECTORY_SEPARATOR . $file);
        }
    }
    rmdir($from);
    closedir($dir);
    return true;
}

1

আপনি YII সাহায্যকারীদের অনুলিপি করতে পারেন

$ ডিরেক্টরি (স্ট্রিং) - পুনরাবৃত্তভাবে মুছতে হবে।

$ বিকল্পগুলি (অ্যারে) - ডিরেক্টরি সরানোর জন্য। বৈধ বিকল্পগুলি হ'ল: ট্র্যাভার্সসিম্লিংকস: বুলিয়ান, ডিরেক্টরিতে সিমলিংকগুলিও ট্র্যাভার করা উচিত কিনা। ডিফল্ট এর falseঅর্থ, সিমলিঙ্কযুক্ত ডিরেক্টরিটির সামগ্রী মুছে ফেলা হবে না। কেবলমাত্র ডিফল্ট ক্ষেত্রে সিমলিংক সরানো হবে।

public static function removeDirectory($directory,$options=array())
{
    if(!isset($options['traverseSymlinks']))
        $options['traverseSymlinks']=false;
    $items=glob($directory.DIRECTORY_SEPARATOR.'{,.}*',GLOB_MARK | GLOB_BRACE);
    foreach($items as $item)
    {
        if(basename($item)=='.' || basename($item)=='..')
            continue;
        if(substr($item,-1)==DIRECTORY_SEPARATOR)
        {
            if(!$options['traverseSymlinks'] && is_link(rtrim($item,DIRECTORY_SEPARATOR)))
                unlink(rtrim($item,DIRECTORY_SEPARATOR));
            else
                self::removeDirectory($item,$options);
        }
        else
            unlink($item);
    }
    if(is_dir($directory=rtrim($directory,'\\/')))
    {
        if(is_link($directory))
            unlink($directory);
        else
            rmdir($directory);
    }
}

0
<?php
  function rrmdir($dir) {
  if (is_dir($dir)) {
    $objects = scandir($dir);
    foreach ($objects as $object) {
      if ($object != "." && $object != "..") {
        if (filetype($dir."/".$object) == "dir") 
           rrmdir($dir."/".$object); 
        else unlink   ($dir."/".$object);
      }
    }
    reset($objects);
    rmdir($dir);
  }
 }
?>

আপনার php.net থেকে ওপোভ কোডটি চেষ্টা করে দেখুন

আমার জন্য ভাল কাজ


0

উইন্ডোজ জন্য:

system("rmdir ".escapeshellarg($path) . " /s /q");

0

প্লেনক্সের সমাধানের মতো তবে মার্জিত বিল্ট-ইন ডিরেক্টরি নির্দেশকটির সাথে:

function delete_directory($dirPath){
 if(is_dir($dirPath)){
  $objects=new DirectoryIterator($dirPath);
   foreach ($objects as $object){
    if(!$object->isDot()){
     if($object->isDir()){
      delete_directory($object->getPathname());
     }else{
      unlink($object->getPathname());
     }
    }
   }
   rmdir($dirPath);
  }else{
   throw new Exception(__FUNCTION__.'(dirPath): dirPath is not a directory!');
  }
 }

0

আমি কোথায় এই ফাংশনটি অনুলিপি করেছি তা মনে নেই তবে এটি দেখে মনে হচ্ছে এটি তালিকাভুক্ত নয় এবং এটি আমার পক্ষে কাজ করছে for

function rm_rf($path) {
    if (@is_dir($path) && is_writable($path)) {
        $dp = opendir($path);
        while ($ent = readdir($dp)) {
            if ($ent == '.' || $ent == '..') {
                continue;
            }
            $file = $path . DIRECTORY_SEPARATOR . $ent;
            if (@is_dir($file)) {
                rm_rf($file);
            } elseif (is_writable($file)) {
                unlink($file);
            } else {
                echo $file . "is not writable and cannot be removed. Please fix the permission or select a new path.\n";
            }
        }
        closedir($dp);
        return rmdir($path);
    } else {
        return @unlink($path);
    }
}

0

সহজ এবং সহজ ...

$dir ='pathtodir';
if (is_dir($dir)) {
  foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)) as $filename) {
    if ($filename->isDir()) continue;
    unlink($filename);
  }
  rmdir($dir);
}

0

এই সম্পর্কে কি?

function Delete_Directory($Dir) 
{
  if(is_dir($Dir))
  {
      $files = glob( $Dir . '*', GLOB_MARK ); //GLOB_MARK adds a slash to directories returned

      foreach( $files as $file )
      {
          Delete_Directory( $file );      
      }
      if(file_exists($Dir))
      {
          rmdir($Dir);
      }
  } 
  elseif(is_file($Dir)) 
  {
     unlink( $Dir );  
  }
}

রেফারেন্স: https://paulund.co.uk/php-delete-directory-and-files-in- ডিরেক্টরি


0

আপনি যদি নিশ্চিত না হন, প্রদত্ত পাথটি ডিরেক্টরি বা ফাইল হয় তবে আপনি পাথ মুছতে এই ফাংশনটি ব্যবহার করতে পারেন

function deletePath($path) {
        if(is_file($path)){
            unlink($path);
        } elseif(is_dir($path)){
            $path = (substr($path, -1) !== DIRECTORY_SEPARATOR) ? $path . DIRECTORY_SEPARATOR : $path;
            $files = glob($path . '*');
            foreach ($files as $file) {
                deleteDirPath($file);
            }
            rmdir($path);
        } else {
            return false;
        }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.