Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Remove Directory recursively

Tags:

php

recursion

I wrote a custom remove function in PHP. The function call is used recursively, but when calling the function, I get an error output:

// custom delete directory function
function deleteDirectory($dir) {
    if (!file_exists($dir)) return true;
    if (!is_dir($dir) || is_link($dir)) return unlink($dir);
    foreach (scandir($dir) as $item) {
        if ($item == '.' || $item == '..') continue;

        // THIS IS LINE 32 LIKE MENTIONED IN THE ERROR
        if (!$this->deleteDirectory($dir . "/" . $item)) {

             // THIS IS LINE 33 LIKE MENTIONED IN THE ERROR
            chmod($dir . "/" . $item, 0777);
            if (!$this->deleteDirectory($dir . "/" . $item)) return false;
        };
    }

    // THIS IS LINE 37 LIKE MENTIONED IN THE ERROR
    return rmdir($dir);
}

function cleanup() {
    $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($this->workFolder), RecursiveIteratorIterator::CHILD_FIRST);
    foreach ($files as $name => $fileObject) {
        if (is_file($name)) {
            unlink($name);
        } else if (is_dir($name)) {
            system("/bin/chmod -R 0777 $name");
            $this->deleteDirectory($name);
        }
    }
    $this->deleteDirectory($this->workFolder);
}

I tried the approach with "$this->deleteDirectory()" but now I receive a totally different error:

Warning: rmdir(/tmp/533aab0362830/.) [function.rmdir]: Invalid argument in /usr/www/users/kontug/api.medifaktor.de/webservice/passkit/class/Pass.php on line 37

Warning: rmdir(/tmp/533aab0362830/../.ICE-unix) [function.rmdir]: Operation not permitted in /usr/www/users/kontug/api.medifaktor.de/webservice/passkit/class/Pass.php on line 37

Warning: chmod() [function.chmod]: Operation not permitted in /usr/www/users/kontug/api.medifaktor.de/webservice/passkit/class/Pass.php on line 33

Warning: rmdir(/tmp/533aab0362830/../.ICE-unix) [function.rmdir]: Operation not permitted in /usr/www/users/kontug/api.medifaktor.de/webservice/passkit/class/Pass.php on line 37
like image 653
konturgestaltung Avatar asked Jan 01 '26 02:01

konturgestaltung


2 Answers

If the function belongs to a class then it should be called like this

$this->deleteDirectory($dir . "/" . $item)

instead of

deleteDirectory($dir . "/" . $item)
like image 107
dikesh Avatar answered Jan 02 '26 15:01

dikesh


When you use classes you must call the method as $this->methodName().
Below is snipped which worked for me.
You can try this. If it gives permission error then you can add chmod function.
Remember you can not traverse a directory if you don't have read permission. So set the permission first.

   function deleteDirectory($dir) {
        if (!file_exists($dir)) return true;
        if (!is_dir($dir)) return unlink($dir);
        foreach (scandir($dir) as $item) {
            if ($item == '.' || $item == '..') continue;
            if (!$this->deleteDirectory($dir.DIRECTORY_SEPARATOR.$item)) return false;
        }
        return rmdir($dir);
    }
like image 43
Vivek Muthal Avatar answered Jan 02 '26 16:01

Vivek Muthal



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!