ลบไดเรกทอรีที่มีไฟล์อยู่หรือไม่


246

ฉันสงสัยว่าวิธีที่ง่ายที่สุดในการลบไดเรกทอรีที่มีไฟล์ทั้งหมดในนั้นคืออะไร

ฉันใช้rmdir(PATH . '/' . $value);เพื่อลบโฟลเดอร์ แต่ถ้ามีไฟล์อยู่ข้างในฉันก็ไม่สามารถลบได้



2
ใช่ตอบในคำถามนั้นอย่างแน่นอน
timdev

แค่ต้องการที่จะทราบ ฉันสร้างหลายไฟล์และหากในระหว่างกระบวนการได้รับข้อผิดพลาดบางอย่างแล้วต้องลบไฟล์ที่สร้างขึ้นก่อนหน้านี้ เมื่อสร้างไฟล์ลืมที่จะใช้และเมื่อลบได้fclose($create_file); Warning: unlink(created_file.xml): Permission denied in...ดังนั้นเพื่อหลีกเลี่ยงข้อผิดพลาดดังกล่าวจะต้องปิดไฟล์ที่สร้างขึ้น
Andris

คำตอบ:


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+ คุณสามารถใช้ RecursiveIterator เพื่อทำมันได้โดยไม่ต้องใช้การเรียกซ้ำด้วยตนเอง:

    $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
การใช้งานครั้งที่สองของคุณค่อนข้างอันตราย: มันไม่ตรวจสอบจุด ( .และ..) และจะลบเส้นทางที่แก้ไขแล้วไม่ใช่เส้นทางจริง
Alix Axel

9
Add-on เล็กน้อย :-) glob () ไม่รองรับไฟล์เช่น. htaccess ฉันใช้ฟังก์ชั่นเพื่อล้างไดเรกทอรีที่ทำโดย KCFinder (ปลั๊กอิน CKEditor) ซึ่งสร้างทั้ง. htaccess และ .umbs (ไฟล์ + โฟลเดอร์) แต่ฉันใช้scandirฟังก์ชั่นเพื่อรับรายการโฟลเดอร์ เพียงให้แน่ใจว่าคุณกรอง '.' และไฟล์ '.. ' จากรายการผลลัพธ์
Joshua - Pendo

25
DIRECTORY_SEPARATOR ไม่จำเป็นเมื่อคุณสร้างเส้นทางเพื่อส่งไปยังระบบปฏิบัติการ Windows จะยอมรับการฟอร์เวิร์ดสแลชด้วย มันมีประโยชน์เป็นหลักสำหรับexplode()เส้นทางที่นำมาจากระบบปฏิบัติการ alanhogan.com/tips/php/directory-separator-not-n needed
ReactiveRaven

5
นอกเหนือจาก @Alix Axel การใช้ที่นี่ [SplFileInfo :: getRealPath ()] ( php.net/manual/en/splfileinfo.getrealpath.php ) ไม่ใช่ความคิดที่ดี วิธีนี้จะขยายลิงก์สัญลักษณ์ทั้งหมดซึ่งหมายความว่าจะถูกลบไฟล์จริงจากที่อื่นแทนที่จะเป็น symlink จากไดเรกทอรีเป้าหมาย คุณควรใช้ SplFileInfo :: getPathname () แทน
Vijit

2
ฉันเห็นด้วยกับ @Vijit ใช้ getPathname () แทน getRealPath () มันทำสิ่งเดียวกันโดยไม่ต้องลบมากกว่าสิ่งที่คุณคาดหวังหากพบ symlink
JoeMoe1984

196

โดยทั่วไปฉันใช้สิ่งนี้เพื่อลบไฟล์ทั้งหมดในโฟลเดอร์:

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

จากนั้นคุณสามารถทำได้

rmdir($dirname);

27
สิ่งนี้จะไม่ลบโฟลเดอร์ซ้ำ ๆ ใช้งานได้เฉพาะในกรณีที่โฟลเดอร์มีไฟล์ปกติเท่านั้นซึ่งทั้งหมดนี้มีนามสกุลไฟล์
mgnb

5
หากไม่จำเป็นต้องทำการสอบถามซ้ำนี่เป็นคำตอบที่ดีที่สุดและง่ายที่สุดในตอนนี้ ขอบคุณ!
eisbehr

2
ในการลบไฟล์ทั้งหมดออกจากโฟลเดอร์ไม่เพียง แต่ไฟล์ที่มีนามสกุลเท่านั้นให้ใช้ glob ด้วยวิธีต่อไปนี้: วิธีarray_map('unlink', glob("$dirname/*"));นี้ยังไม่อนุญาตให้คุณลบไดเรกทอรีที่ซ้อนกันในโฟลเดอร์
kremuwa

โปรดทราบว่าจะเป็นการลบไฟล์จุด (ซ่อน) เช่นกัน
BadHorsie

84

วิธีที่ง่ายที่สุดในการลบไดเรกทอรีที่มีไฟล์ทั้งหมดอยู่ในนั้นคืออะไร?

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

33
ฉันหวังว่าคุณจะไม่จริงจัง จะเกิดอะไรขึ้นถ้า $ dir คือ /
The Pixel Developer

108
@ รหัสตรงกับรหัสใด ๆ ด้านบน ไม่ใช่เหรอ
สามัญสำนึกของคุณ

7
โปรดทราบว่า$dirคุณอาจต้องทำการประมวลผลล่วงหน้าเพิ่มเติมเพื่อให้ปลอดภัยและหลีกเลี่ยงข้อบกพร่อง ตัวอย่างเช่นหาก$dirอาจมีช่องว่างหรือเซมิโคลอนอยู่ข้างในอาจมีผลข้างเคียงที่ไม่พึงประสงค์ นี่ไม่ใช่กรณีที่มีคำตอบที่ใช้สิ่งต่าง ๆ เช่นrmdir()เพราะมันจะจัดการกับตัวละครพิเศษสำหรับคุณ
Trott

5
รุ่น Windows:system('rmdir '.escapeshellarg($path).' /s /q');
Cypher

2
@ThePixelDeveloper คุณไม่ควรกังวลเกี่ยวกับการลบ / นี้งานจะเฉพาะในกรณีที่คุณต้องการ lounch สคริปต์ในบรรทัดคำสั่งเป็นรากเพราะในเว็บทุกอย่างเกิดขึ้นเป็นผู้ใช้ Apache
เบน

49

ฟังก์ชั่นสั้น ๆ ที่ทำงาน:

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

ฉันใช้ในชั้น Utils เช่นนี้:

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
แบบคงที่ไม่ทำงานเพราะ $ this === NULL เมื่อคุณเรียกใช้ฟังก์ชันคงที่ในชั้นเรียน มันจะทำงานถ้า$this_func = array(__CLASS__, __FUNCTION__);
แมตต์คอนนอลลี่

2
บางคนสามารถอธิบายบรรทัดได้array_map($class_func, glob($path.'/*')) == @rmdir($path)หรือไม่ ฉันเดาว่าเขาเรียกคืนผ่านโฟลเดอร์ย่อย แต่ส่วน == @rmdir ทำอะไรได้บ้าง <array of booleans> == <boolean> ส่งคืนคำตอบได้อย่างไร มันตรวจสอบว่าแต่ละค่าตอบแทนของการเรียกซ้ำเหมือนกันกับบูลีนทางด้านขวาหรือไม่?
arviman

2
มันเป็นเคล็ดลับที่จะรวมสองคำสั่งไว้ในคำสั่งเดียว นี่เป็นเพราะผู้ประกอบการที่ประกอบไปด้วยไตรภาคอนุญาตเพียงหนึ่งคำสั่งต่อการโต้แย้ง array_map(...)ลบไฟล์ทั้งหมดภายในไดเรกทอรี@rmdir(...)ลบไดเรกทอรีเอง
Blaise

3
ระวัง! ฟังก์ชั่นนี้ไม่ได้ตรวจสอบว่าเส้นทางนั้นมีอยู่จริงหรือไม่ หากคุณผ่านอาร์กิวเมนต์ที่ว่างเปล่าฟังก์ชันจะเริ่มลบไฟล์ที่เริ่มต้นจากรูท! เพิ่มการตรวจสอบสติให้กับเส้นทางของคุณก่อนที่คุณจะเรียกใช้ฟังก์ชั่นนี้
Tatu Ulmanen

3
บางคนไม่เห็นความคิดเห็นของ Tatu และถูกลบซ้ำ/ๆ ดังนั้นฉันจึงเพิ่มเวอร์ชันที่มีการป้องกันไว้ในโพสต์ของฉัน
Blaise

22

ตามที่เห็นในความคิดเห็นที่โหวตมากที่สุดในหน้าคู่มือ PHP เกี่ยวกับ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 ("$ dir / $ file") - ไม่พบกับพารามิเตอร์ "$ dir / $ file"
Igor L.

คุณหมายถึงอะไร มันตรวจสอบว่ารายการที่พบในไดเรกทอรี ( $file) เป็นไดเรกทอรีหรือไฟล์ เป็นเช่นเดียวกับ"$dir/$file" $dir . "/" . $file
Latorre เยอรมัน

ฉันไม่ทราบว่าคุณสามารถต่อตัวแปรแบบนี้ได้จริง :) :) ขอบคุณ
Igor L.

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

คุณสามารถใช้ระบบไฟล์ของ Symfony ( รหัส ):

// composer require symfony/filesystem

use Symfony\Component\Filesystem\Filesystem;

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

อย่างไรก็ตามฉันไม่สามารถลบโครงสร้างไดเรกทอรีที่ซับซ้อนด้วยวิธีนี้ได้ดังนั้นก่อนอื่นคุณควรลองเพื่อให้แน่ใจว่ามันทำงานได้อย่างถูกต้อง


ฉันสามารถลบโครงสร้างไดเรกทอรีดังกล่าวโดยใช้การใช้งานเฉพาะของ Windows:

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

ขอบคุณมากคุณประหยัดเวลาของฉัน
zarif khan

"อย่าบูรณาการล้อ" ขอบคุณ
Kamafeather

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

}

ฟังก์ชั่นจะขึ้นอยู่กับการเรียกซ้ำทำเพื่อคัดลอกไดเรกทอรี คุณสามารถค้นหาฟังก์ชั่นนั้นได้ที่นี่: คัดลอกเนื้อหาทั้งหมดของไดเรกทอรีไปยังอีกอันโดยใช้ php


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

ps จำได้!
อย่าส่งค่าว่างไปยังฟังก์ชันลบไดเรกทอรีใด ๆ !!! (สำรองข้อมูลไว้เสมอมิฉะนั้นวันหนึ่งคุณอาจได้รับภัยพิบัติ !!)


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

ฟังก์ชั่น Glob ไม่ส่งคืนไฟล์ที่ซ่อนอยู่ดังนั้นการสแกนด้วยวิธีนี้มีประโยชน์มากกว่าเมื่อพยายามลบทรีแบบวนซ้ำ

<?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

ฉันชอบสิ่งนี้เพราะมันยังคงส่งคืน TRUE เมื่อมันประสบความสำเร็จและเป็นเท็จเมื่อมันล้มเหลวและยังป้องกันข้อผิดพลาดที่เส้นทางว่างอาจลองและลบทุกอย่างออกจาก '/ *' !!:

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 ด้วยความคิดเห็นโดย @Vijit สำหรับจัดการ symlink ประการแรกใช้ getRealPath () แต่ถ้าคุณมี symlink ใด ๆ ที่เป็นโฟลเดอร์มันจะล้มเหลวเพราะมันจะพยายามโทร 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
ฉันมีตัวแทนไม่เพียงพอที่จะแสดงความคิดเห็นกับคำตอบโดยตรง
user701152

3

ใช้ DirectoryIterator เทียบเท่าคำตอบก่อนหน้า ...

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

litle บิตปรับเปลี่ยนรหัส alcuadrado ของ - globไม่เห็นไฟล์ที่มีชื่อจากจุดเช่น.htaccessดังนั้นฉันจะใช้ scandir และสคริปต์ลบตัวเอง - __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

ตัวอย่างสำหรับเซิร์ฟเวอร์ Linux: exec('rm -f -r ' . $cache_folder . '/*');


ฉันมักจะต้องการเพิ่มการตรวจสอบสติใน $ cache_folder ก่อนที่จะใช้ rm -rf เพื่อหลีกเลี่ยงข้อผิดพลาดค่าใช้จ่ายสูง
glyph

1

ลบไฟล์ทั้งหมดในโฟลเดอร์
array_map('unlink', glob("$directory/*.*"));
Delete all. * - ไฟล์ในโฟลเดอร์ (ไม่มี: "." และ ".. ")
array_map('unlink', array_diff(glob("$directory/.*),array("$directory/.","$directory/..")))
ตอนนี้ลบโฟลเดอร์เอง
rmdir($directory)


1

2 เซ็นต์เพื่อเพิ่มไปยังคำตอบข้างต้นซึ่งเป็น BTW ที่ยอดเยี่ยม

หลังจากฟังก์ชัน glob (หรือคล้ายกัน) ของคุณสแกน / อ่านไดเรกทอรีเพิ่มเงื่อนไขเพื่อตรวจสอบการตอบสนองที่ไม่ว่างเปล่าหรือ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

$ directory (สตริง) - จะถูกลบซ้ำ

$ options (array) - สำหรับการลบไดเรกทอรี ตัวเลือกที่ถูกต้องคือ: traverseSymlinks: บูลีนไม่ว่าจะเป็นการเชื่อมโยงไปยังไดเรกทอรีที่ควรสำรวจด้วย ค่าเริ่มต้นfalseซึ่งหมายความว่าเนื้อหาของไดเรกทอรี symlinked จะไม่ถูกลบ symlink เท่านั้นที่จะถูกลบในกรณีเริ่มต้น

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

ทดลองใช้รหัส obove ของคุณจาก php.net

ทำงานให้ฉันได้ดี



0

เช่นเดียวกับโซลูชันของ Playnox แต่ด้วย DirectoryIterator ในตัวที่สง่างาม:

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

ฉันจำไม่ได้ว่าฉันคัดลอกฟังก์ชันนี้ไปจากที่ใด แต่ดูเหมือนว่าไม่ได้อยู่ในรายการและใช้งานได้สำหรับฉัน

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 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.