339 votes

Suppression de tous les fichiers d'un dossier en PHP ?

Par exemple, j'avais un dossier appelé `Temp' et je voulais supprimer ou vider tous les fichiers de ce dossier en utilisant PHP. Est-ce que je peux le faire ?

15 votes

C'est une bonne chose que cette question ait reçu une réponse plus bas avant d'être marquée comme dupliquée. Les réponses ci-dessous sont bien meilleures que la réponse à la question liée. De plus la question est différente, cette question demande de vider un répertoire, pas de le supprimer.

1 votes

Oui, c'est une question différente qui a suscité des réponses différentes. Elle ne devrait pas être marquée comme un doublon.

685voto

Floern Points 11484
$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 la méthode suivante

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

4 votes

Il existe également DirectoryIterator ou DirectoryRecursiveIterator.

10 votes

Bien que ce soit évident, je précise que, par exemple, "path/to/temp/*.txt" ne supprimera que les fichiers txt et ainsi de suite.

0 votes

Cela fonctionne-t-il aussi pour les chemins relatifs ? Disons que le chemin complet est "/var/www/html/folder_and_files_to_delete/" et que le script de suppression est placé dans "/var/www/html/delete_folders_and_files.php". Puis-je simplement prendre "folder_and_files_to_delete" comme chemin ?

287voto

Stichoza Points 1279

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

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

Cet appel peut également gérer les répertoires vides ( merci pour l'astuce, @mojuba !)

35 votes

Meilleure réponse, merci. Pour éviter les notifications, je ferais également glob("...") ?: [] (PHP 5.4+) car pour un répertoire vide glob() renvoie à false .

19 votes

Elle supprime tous les fichiers du dossier en cours, mais elle renvoie un avertissement pour les sous-dossiers et ne les supprime pas.

2 votes

En combinant les réponses de Stichoza et de mojuba : array_map('unlink', ( glob( "path/to/temp/*" ) ? glob( "path/to/temp/*" ) : array() ) );

72voto

JakeParis Points 4627
foreach (new DirectoryIterator('/path/to/directory') as $fileInfo) {
    if(!$fileInfo->isDot()) {
        unlink($fileInfo->getPathname());
    }
}

0 votes

Cela devrait être unlink('/path/to/directory/'.$fileInfo->getFilename()) ; puisque unlink prend en compte le chemin. Bonne réponse cependant.

9 votes

Vous pourriez même faire unlink($fileInfo->getPathname()) ; ce qui vous donnerait le chemin complet du fichier. php.net/manual/fr/directoryiterator.getpathname.php

0 votes

La fonction "DirectoryIterator" ne permet-elle pas également d'itérer sur les sous-répertoires ? Si c'est le cas, 'unlink' génèrerait un avertissement dans de tels cas. Le corps de la boucle ne devrait-il pas plutôt ressembler à la réponse de Yamiko et vérifier chaque entrée si c'est un fichier avant d'appeler 'unlink' ?

22voto

Poelinca Dorin Points 5491

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

11voto

StampedeXV Points 1221

Voir readdir y délier .

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X