web-dev-qa-db-fra.com

Supprimer tous les fichiers d'un dossier en utilisant PHP?

Par exemple, j'avais un dossier appelé «Temp» et je voulais supprimer ou vider tous les fichiers de ce dossier en utilisant PHP. Puis-je faire ça?

267
getaway
$files = glob('path/to/temp/*'); // get all file names
foreach($files as $file){ // iterate files
  if(is_file($file))
    unlink($file); // delete file
}

Si vous souhaitez supprimer des fichiers "cachés" comme .htaccess, vous devez utiliser

$files = glob('path/to/temp/{,.}*', GLOB_BRACE);
577
Floern

Si vous souhaitez tout supprimer du dossier (y compris les sous-dossiers), utilisez cette combinaison de array_map, unlink et glob:

array_map('unlink', glob("path/to/temp/*"));

Mettre à jour

Cet appel peut également gérer des répertoires vides - merci pour le conseil, @mojuba!

array_map('unlink', array_filter((array) glob("path/to/temp/*")));
239
Stichoza

Voici une approche plus moderne utilisant la bibliothèque Standard PHP (SPL) .

$dir = "path/to/directory";
$di = new RecursiveDirectoryIterator($dir, FilesystemIterator::SKIP_DOTS);
$ri = new RecursiveIteratorIterator($di, RecursiveIteratorIterator::CHILD_FIRST);
foreach ( $ri as $file ) {
    $file->isDir() ?  rmdir($file) : unlink($file);
}
return true;
82
Yamiko
foreach (new DirectoryIterator('/path/to/directory') as $fileInfo) {
    if(!$fileInfo->isDot()) {
        unlink($fileInfo->getPathname());
    }
}
68
JakeParis

Ce code de http://php.net/unlink :

/**
 * Delete a file or recursively delete a directory
 *
 * @param string $str Path to file or directory
 */
function recursiveDelete($str) {
    if (is_file($str)) {
        return @unlink($str);
    }
    elseif (is_dir($str)) {
        $scan = glob(rtrim($str,'/').'/*');
        foreach($scan as $index=>$path) {
            recursiveDelete($path);
        }
        return @rmdir($str);
    }
}
19
Poelinca Dorin
$dir = 'your/directory/';
foreach(glob($dir.'*.*') as $v){
    unlink($v);
}
14
Haim Evgi

Voir readdir et unlink .

<?php
    if ($handle = opendir('/path/to/files'))
    {
        echo "Directory handle: $handle\n";
        echo "Files:\n";

        while (false !== ($file = readdir($handle)))
        {
            if( is_file($file) )
            {
                unlink($file);
            }
        }
        closedir($handle);
    }
?>
11
StampedeXV

En supposant que vous ayez un dossier avec BEAUCOUP de fichiers qui les lisent tous et que vous supprimez ensuite en deux étapes n’est pas performant. Je pense que le moyen le plus performant de supprimer des fichiers est d’utiliser une commande système. 

Par exemple sur Linux j'utilise:

exec('rm -f '. $absolutePathToFolder .'*');

Ou ceci si vous voulez une suppression récursive sans avoir besoin d'écrire une fonction récursive

exec('rm -f -r '. $absolutePathToFolder .'*');

les mêmes commandes existent pour tous les systèmes d'exploitation pris en charge par PHP . N'oubliez pas qu'il s'agit d'un moyen PERFORMANT de supprimer des fichiers. $ absolutePathToFolder DOIT être vérifié et sécurisé avant d'exécuter ce code et les autorisations doivent être accordées.

9
Dario Corno

Le moyen le plus simple et le plus efficace de supprimer tous les fichiers d'un dossier en PHP

$files = glob('my_folder/*'); //get all file names
foreach($files as $file){
    if(is_file($file))
    unlink($file); //delete file
}

Vous avez ce code source à partir d'ici - http://www.codexworld.com/delete-all-files-from-folder-using-php/

8
JoyGuru

Une autre solution: Cette classe supprime tous les fichiers, sous-répertoires et fichiers des sous-répertoires.

class Your_Class_Name {
    /**
     * @see http://php.net/manual/de/function.array-map.php
     * @see http://www.php.net/manual/en/function.rmdir.php 
     * @see http://www.php.net/manual/en/function.glob.php
     * @see http://php.net/manual/de/function.unlink.php
     * @param string $path
     */
    public function delete($path) {
        if (is_dir($path)) {
            array_map(function($value) {
                $this->delete($value);
                rmdir($value);
            },glob($path . '/*', GLOB_ONLYDIR));
            array_map('unlink', glob($path."/*"));
        }
    }
}
4
tommy

unlinkr function supprime récursivement tous les dossiers et fichiers du chemin donné en veillant à ne pas supprimer le script lui-même.

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('..', '.')))  {
            echo "<p>opening directory $file </p>";
            unlinkr($file, $pattern);
            //remove the directory itself
            echo "<p> deleting directory $file </p>";
            rmdir($file);
        } else if(is_file($file) and ($file != __FILE__)) {
            // make sure you don't delete the current script
            echo "<p>deleting file $file </p>";
            unlink($file); 
        }
    }
}

si vous souhaitez supprimer tous les fichiers et dossiers où vous placez ce script, appelez-le comme suit:

//get current working directory
$dir = getcwd();
unlinkr($dir);

si vous voulez simplement supprimer les fichiers php, appelez-le comme suit

unlinkr($dir, "*.php");

vous pouvez aussi utiliser n'importe quel autre chemin pour supprimer les fichiers 

unlinkr("/home/user/temp");

Cela supprimera tous les fichiers du répertoire home/user/temp.

4
Tofeeq

Publication d'une classe de traitement de fichiers et de dossiers à usage général pour copier, déplacer, supprimer, calculer la taille, etc., pouvant gérer un seul fichier ou un ensemble de dossiers 

https://Gist.github.com/4689551

Utiliser: 

Pour copier (ou déplacer) un seul fichier ou un ensemble de dossiers/fichiers:

$files = new Files();
$results = $files->copyOrMove('source/folder/optional-file', 'target/path', 'target-file-name-for-single-file.only', 'copy');

Supprimez un seul fichier ou tous les fichiers et dossiers d'un chemin:

$files = new Files();
$results = $files->delete('source/folder/optional-file.name');

Calculez la taille d'un seul fichier ou d'un ensemble de fichiers dans un ensemble de dossiers:

$files = new Files();
$results = $files->calculateSize('source/folder/optional-file.name');
3
AmyStephen
 <?
//delete all files from folder  & sub folders
function listFolderFiles($dir)
{
    $ffs = scandir($dir);
    echo '<ol>';
    foreach ($ffs as $ff) {
        if ($ff != '.' && $ff != '..') {
            if (file_exists("$dir/$ff")) {
                unlink("$dir/$ff");
            }
            echo '<li>' . $ff;
            if (is_dir($dir . '/' . $ff)) {
                listFolderFiles($dir . '/' . $ff);
            }
            echo '</li>';
        }
    }
    echo '</ol>';
}
$arr = array(
    "folder1",
    "folder2"
);
for ($x = 0; $x < count($arr); $x++) {
    $mm = $arr[$x];
    listFolderFiles($mm);
}
//end
?> 
1
user5579724

Pour moi, la solution avec readdir était la meilleure et a fonctionné à merveille. Avec glob, la fonction échouait avec certains scénarios.

// Remove a directory recursively
function removeDirectory($dirPath) {
    if (! is_dir($dirPath)) {
        return false;
    }

    if (substr($dirPath, strlen($dirPath) - 1, 1) != '/') {
        $dirPath .= '/';
    }

    if ($handle = opendir($dirPath)) {

        while (false !== ($sub = readdir($handle))) {
            if ($sub != "." && $sub != ".." && $sub != "Thumb.db") {
                $file = $dirPath . $sub;

                if (is_dir($file)) {
                    removeDirectory($file);
                } else {
                    unlink($file);
                }
            }
        }

        closedir($handle);
    }

    rmdir($dirPath);
}
1
Tiago Silva Pereira

Il y a un paquet appelé "Pusheh". En l’utilisant, vous pouvez effacer un répertoire ou supprimer complètement un répertoire ( lien Github ). Il est disponible sur Packagist , aussi.

Par exemple, si vous souhaitez effacer le répertoire Temp, vous pouvez effectuer les opérations suivantes:

Pusheh::clearDir("Temp");

// Or you can remove the directory completely
Pusheh::removeDirRecursively("Temp");

Si cela vous intéresse, voir le wiki .

0
MAChitgarha

J'ai mis à jour la réponse de @Stichoza pour supprimer les fichiers des sous-dossiers.

function glob_recursive($pattern, $flags = 0) {
    $fileList = glob($pattern, $flags);
    foreach (glob(dirname($pattern).'/*', GLOB_ONLYDIR|GLOB_NOSORT) as $dir) {
        $subPattern = $dir.'/'.basename($pattern);
        $subFileList = glob_recursive($subPattern, $flags);
        $fileList = array_merge($fileList, $subFileList);
    }
    return $fileList;
}

function glob_recursive_unlink($pattern, $flags = 0) {
    array_map('unlink', glob_recursive($pattern, $flags));
}
0
tzi
public static function recursiveDelete($dir)
{
    foreach (new \DirectoryIterator($dir) as $fileInfo) {
        if (!$fileInfo->isDot()) {
            if ($fileInfo->isDir()) {
                recursiveDelete($fileInfo->getPathname());
            } else {
                unlink($fileInfo->getPathname());
            }
        }
    }
    rmdir($dir);
}
0
Mehmet