Suppression de 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. Pourrais-je faire cela?

255
demandé sur Peter Mortensen 2011-01-04 16:35:43

15 réponses

$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 voulez supprimer des fichiers 'cachés' comme .htaccess, vous devez utiliser

$files = glob('path/to/temp/{,.}*', GLOB_BRACE);
558
répondu Floern 2016-10-04 17:04:13

Si vous voulez 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/*"));

Mise à Jour

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

array_map('unlink', array_filter((array) glob("path/to/temp/*")));
224
répondu Stichoza 2018-09-14 10:33:32

Voici une approche plus moderne utilisant la bibliothèque PHP Standard (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;
75
répondu Yamiko 2016-04-12 12:13:23
foreach (new DirectoryIterator('/path/to/directory') as $fileInfo) {
    if(!$fileInfo->isDot()) {
        unlink($fileInfo->getPathname());
    }
}
67
répondu JakeParis 2016-04-12 16:29:34

Ce code à partir 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
répondu Poelinca Dorin 2015-05-16 21:19:38
$dir = 'your/directory/';
foreach(glob($dir.'*.*') as $v){
    unlink($v);
}
13
répondu Haim Evgi 2011-01-04 13:45:19

Voir readdir et dissocier.

<?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);
    }
?>
10
répondu StampedeXV 2015-05-16 21:18:32

En supposant que vous avez un dossier avec beaucoup de fichiers les lisant tous, puis en les supprimant en deux étapes, ce n'est pas aussi performant. Je crois que la façon la plus performante de supprimer des fichiers est d'utiliser simplement 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 tout système d'exploitation supporté par PHP. Gardez à l'esprit que c'est 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.

8
répondu Dario Corno 2017-09-28 13:39:37

Le moyen simple et le meilleur 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
}

J'ai ce code source d'ici - http://www.codexworld.com/delete-all-files-from-folder-using-php/

7
répondu JoyGuru 2016-06-21 06:51:20

Une autre solution: Cette classe supprime tous les fichiers, sous-répertoires et fichiers dans les 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
répondu tommy 2014-07-17 13:44:54

La fonction Unlinkr supprime récursivement tous les dossiers et fichiers du chemin donné en s'assurant qu'elle ne supprime pas 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 dans lesquels vous placez ce script, appelez-le comme suit

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

Si vous voulez simplement supprimer des fichiers php, appelez-le comme suit

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

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

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

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

4
répondu Tofeeq 2015-11-20 07:28:03

A publié une classe de gestion de fichiers et de dossiers à usage général pour copier, déplacer, supprimer, calculer la taille, etc., qui peut 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');

Supprimer un seul fichier ou tous les fichiers et dossiers dans un chemin:

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

Calculer la taille d'un fichier unique ou un ensemble de fichiers dans un ensemble de dossiers:

$files = new Files();
$results = $files->calculateSize('source/folder/optional-file.name');
3
répondu AmyStephen 2013-02-01 06:05:41

Pour moi, la solution avec readdir était la meilleure et a fonctionné comme un charme. 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
répondu Tiago Silva Pereira 2018-03-13 04:44:24

J'ai mis à jour la réponse de @Stichoza pour supprimer des fichiers via 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
répondu tzi 2014-10-17 12:57:08
 <?
//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
?> 
0
répondu user5579724 2015-11-19 05:51:51