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?
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);
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/*")));
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;
foreach (new DirectoryIterator('/path/to/directory') as $fileInfo) {
if(!$fileInfo->isDot()) {
unlink($fileInfo->getPathname());
}
}
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);
}
}
$dir = 'your/directory/';
foreach(glob($dir.'*.*') as $v){
unlink($v);
}
<?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);
}
?>
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.
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/
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."/*"));
}
}
}
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.
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');
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);
}
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));
}
<?
//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
?>