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);
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);
}
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);
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);
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");
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' );
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;
}
}
Une façon de procéder serait:
function unlinker($file)
{
unlink($file);
}
$files = glob('*.*');
array_walk($files,'unlinker');
rmdir($dir);
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);
?>