it-swarm.com.de

So löschen Sie einen Ordner mit dem Inhalt PHP

Ich muss einen Ordner mit Inhalt mit PHP löschen. rmdir() und unlink() löschen leere Ordner, können jedoch Ordner mit Inhalt nicht löschen.

27
Fero

Mit dieser Funktion können Sie jeden Ordner (sofern er beschreibbar ist) und die darin enthaltenen Dateien und Unterverzeichnisse löschen.

function Delete($path)
{
    if (is_dir($path) === true)
    {
        $files = array_diff(scandir($path), array('.', '..'));

        foreach ($files as $file)
        {
            Delete(realpath($path) . '/' . $file);
        }

        return rmdir($path);
    }

    else if (is_file($path) === true)
    {
        return unlink($path);
    }

    return false;
}

Oder ohne Rekursion mit RecursiveDirectoryIterator:

function Delete($path)
{
    if (is_dir($path) === true)
    {
        $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::CHILD_FIRST);

        foreach ($files as $file)
        {
            if (in_array($file->getBasename(), array('.', '..')) !== true)
            {
                if ($file->isDir() === true)
                {
                    rmdir($file->getPathName());
                }

                else if (($file->isFile() === true) || ($file->isLink() === true))
                {
                    unlink($file->getPathname());
                }
            }
        }

        return rmdir($path);
    }

    else if ((is_file($path) === true) || (is_link($path) === true))
    {
        return unlink($path);
    }

    return false;
}
80
Alix Axel

Sie müssen den Ordnerinhalt (einschließlich der Inhalte aller Unterordner) durchlaufen und zuerst entfernen.

Hier ist ein Beispiel: http://lixlpixel.org/recursive_function/php/recursive_directory_delete/

Sei vorsichtig damit !!!

3
Fenton

Hier ist ein Skript, das genau das tut, was Sie brauchen:

/**
 * Recursively delete a directory
 *
 * @param string $dir Directory name
 * @param boolean $deleteRootToo Delete specified top-level directory as well
 */
function unlinkRecursive($dir, $deleteRootToo)
{
    if(!$dh = @opendir($dir))
    {
        return;
    }
    while (false !== ($obj = readdir($dh)))
    {
        if($obj == '.' || $obj == '..')
        {
            continue;
        }

        if ([email protected]($dir . '/' . $obj))
        {
            unlinkRecursive($dir.'/'.$obj, true);
        }
    }

    closedir($dh);

    if ($deleteRootToo)
    {
        @rmdir($dir);
    }

    return;
}

Ich habe es von php.net bekommen und es funktioniert.

3
Randell

Es gibt keine einzige in PHP eingebaute Funktion, die dies erlaubt. Sie müssen Ihre eigene mit rmdir und unlink schreiben.

Ein Beispiel (aus einem Kommentar zu php.net docs ):

<?
// ensure $dir ends with a slash
function delTree($dir) {
    $files = glob( $dir . '*', GLOB_MARK );
    foreach( $files as $file ){
        if( substr( $file, -1 ) == '/' )
            delTree( $file );
        else
            unlink( $file );
    }
    rmdir( $dir );
}
?>
2

Sie müssen alle Dateien rekursiv löschen. In den Kommentaren der rmdir-Manualpage gibt es viele Beispielfunktionen:

http://www.php.net/rmdir

1
Ferdinand Beyer

Sie könnten immer betrügen und tun Shell_exec("rm -rf /path/to/folder");

0
ryeguy