web-dev-qa-db-fra.com

PHP: dissocier tous les fichiers d'un répertoire, puis supprimer ce répertoire

Puis-je utiliser les recherches RegExp ou Wildcard pour supprimer rapidement tous les fichiers d'un dossier, puis supprimer ce dossier en PHP, SANS utiliser la commande "exec"? Mon serveur ne me donne pas l'autorisation d'utiliser cette commande. Une simple boucle quelconque suffirait.

J'ai besoin de quelque chose qui accomplirait la logique derrière la déclaration suivante, mais évidemment, serait valide:


$dir = "/home/dir"
unlink($dir . "/*"); # "*" being a match for all strings
rmdir($dir);
32
NoodleOfDeath

Utilisez glob pour trouver tous les fichiers correspondant à un modèle.

function recursiveRemoveDirectory($directory)
{
    foreach(glob("{$directory}/*") as $file)
    {
        if(is_dir($file)) { 
            recursiveRemoveDirectory($file);
        } else {
            unlink($file);
        }
    }
    rmdir($directory);
}
77
Lusitanian

Utilisez glob() pour parcourir facilement le répertoire pour supprimer des fichiers, puis vous pouvez supprimer le répertoire.

foreach (glob($dir."/*.*") as $filename) {
    if (is_file($filename)) {
        unlink($filename);
    }
}
rmdir($dir);
17
John Conde

La fonction glob() fait ce que vous recherchez. Si vous êtes sur PHP 5.3+, vous pouvez faire quelque chose comme ceci:

$dir = ...
array_walk(glob($dir . '/*'), function ($fn) {
    if (is_file($fn))
        unlink($fn);
});
unlink($dir);
9
svens

Essayez de manière simple:

$dir = "/home/dir";
array_map('unlink', glob($dir."/*"));
rmdir($dir);

dans la fonction pour supprimer dir:

function unlinkr($dir, $pattern = "*") {
        // find all files and folders matching pattern
        $files = glob($dir . "/$pattern"); 
        //interate thorugh the files and folders
        foreach($files as $file){ 
            //if it is a directory then re-call unlinkr function to delete files inside this directory     
            if (is_dir($file) and !in_array($file, array('..', '.')))  {
                unlinkr($file, $pattern);
                //remove the directory itself
                rmdir($file);
                } else if(is_file($file) and ($file != __FILE__)) {
                // make sure you don't delete the current script
                unlink($file); 
            }
        }
        rmdir($dir);
    }

//call following way:
unlinkr("/home/dir");
6
Ahosan Karim Asik

Un moyen simple et efficace de supprimer tous les fichiers et dossiers récursivement avec Standard PHP Library , pour être précis, RecursiveIteratorIterator et RecursiveDirectoryIterator . Le point est dans l'indicateur RecursiveIteratorIterator::CHILD_FIRST, L'itérateur parcourra d'abord les fichiers et le répertoire à la fin, donc une fois que le répertoire est vide, il est sûr d'utiliser rmdir().

foreach( new RecursiveIteratorIterator( 
    new RecursiveDirectoryIterator( 'folder', FilesystemIterator::SKIP_DOTS | FilesystemIterator::UNIX_PATHS ), 
    RecursiveIteratorIterator::CHILD_FIRST ) as $value ) {
        $value->isFile() ? unlink( $value ) : rmdir( $value );
}

rmdir( 'folder' );
5
Danijel

Vous pouvez utiliser le composant Symfony Filesystem , pour éviter de réinventer la roue, donc vous pouvez faire

use Symfony\Component\Filesystem\Filesystem;

$filesystem = new Filesystem();

if ($filesystem->exists('/home/dir')) {
    $filesystem->remove('/home/dir');
}

Si vous préférez gérer le code vous-même, voici la base de code Symfony pour les méthodes pertinentes

class MyFilesystem
{
    private function toIterator($files)
    {
        if (!$files instanceof \Traversable) {
            $files = new \ArrayObject(is_array($files) ? $files : array($files));
        }

        return $files;
    }

    public function remove($files)
    {
        $files = iterator_to_array($this->toIterator($files));
        $files = array_reverse($files);
        foreach ($files as $file) {
            if (!file_exists($file) && !is_link($file)) {
                continue;
            }

            if (is_dir($file) && !is_link($file)) {
                $this->remove(new \FilesystemIterator($file));

                if (true !== @rmdir($file)) {
                    throw new \Exception(sprintf('Failed to remove directory "%s".', $file), 0, null, $file);
                }
            } else {
                // https://bugs.php.net/bug.php?id=52176
                if ('\\' === DIRECTORY_SEPARATOR && is_dir($file)) {
                    if (true !== @rmdir($file)) {
                        throw new \Exception(sprintf('Failed to remove file "%s".', $file), 0, null, $file);
                    }
                } else {
                    if (true !== @unlink($file)) {
                        throw new \Exception(sprintf('Failed to remove file "%s".', $file), 0, null, $file);
                    }
                }
            }
        }
    }

    public function exists($files)
    {
        foreach ($this->toIterator($files) as $file) {
            if (!file_exists($file)) {
                return false;
            }
        }

        return true;
    }
}
4
Adam Elsodaney

Une façon de procéder serait:

function unlinker($file)
{
    unlink($file);
}
$files = glob('*.*');
array_walk($files,'unlinker');
rmdir($dir);
1
Adi

pour supprimer tous les fichiers, vous pouvez supprimer le répertoire et refaire .. avec une simple ligne de code

<?php 
    $dir = '/home/files/';
    rmdir($dir);
    mkdir($dir);
?>
0