web-dev-qa-db-fra.com

Comment supprimer un dossier avec du contenu en utilisant PHP

Je dois supprimer un dossier avec du contenu en PHP. rmdir() et unlink() suppriment les dossiers vides, mais ne peuvent pas supprimer les dossiers ayant un contenu.

27
Fero

Cette fonction vous permettra de supprimer n'importe quel dossier (tant qu'il est accessible en écriture), ses fichiers et ses sous-répertoires.

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

Ou sans récursion en utilisant 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

Vous devez faire une boucle autour du contenu du dossier (y compris le contenu des sous-dossiers) et les supprimer en premier.

Il y a un exemple ici: http://lixlpixel.org/recursive_function/php/recursive_directory_delete/

Faites attention avec ça !!!

3
Fenton

Voici un script qui fera exactement ce dont vous avez besoin:

/**
 * 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 (!@unlink($dir . '/' . $obj))
        {
            unlinkRecursive($dir.'/'.$obj, true);
        }
    }

    closedir($dh);

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

    return;
}

Je l'ai eu de php.net et cela fonctionne.

3
Randell

Il n’existe pas de fonction unique construite dans PHP qui le permettrait, vous devez écrire la vôtre avec rmdir et unlink.

Un exemple (tiré d'un commentaire sur 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
Krzysztof Krasoń

Vous devrez supprimer tous les fichiers de manière récursive. Il y a beaucoup d'exemples de fonctions dans les commentaires de la page de manuel rmdir:

http://www.php.net/rmdir

1
Ferdinand Beyer

Vous pouvez toujours tricher et faire Shell_exec("rm -rf /path/to/folder");

0
ryeguy