Eliminar un directorio no vacío
-
28-10-2019 - |
Pregunta
rmdir("./uploads/temp/".$user."/");
Tengo muchos archivos en un directorio que deseo eliminar en mi script PHP, sin embargo, estas no es una forma para que no me desintegue () el archivo primero. ¿Hay alguna forma de hacer?
unlink(* FROM (dir=)) // don't downvote the long shot
// delete all files from the dir first
// then delete that dir
Referencia Un directorio debe estar vacío para eliminarlo, ver php.net/manual/en/function.rmdir.php
Solución
No hay otra forma excepto para eliminar todos los archivos primero usando de una forma u otra y luego eliminar el directorio.
public static function deleteDir($dirPath) {
if (! is_dir($dirPath)) {
throw new InvalidArgumentException('$dirPath must be a directory');
}
if (substr($dirPath, strlen($dirPath) - 1, 1) != '/') {
$dirPath .= '/';
}
$files = glob($dirPath . '*', GLOB_MARK);
foreach ($files as $file) {
if (is_dir($file)) {
self::deleteDir($file);
} else {
unlink($file);
}
}
rmdir($dirPath);
}
Otros consejos
Puedes usar el Directorio y unlink
juntos.
utilizar este
function delete_directory($dirname) {
if (is_dir($dirname))
$dir_handle = opendir($dirname);
if (!$dir_handle)
return false;
while($file = readdir($dir_handle)) {
if ($file != "." && $file != "..") {
if (!is_dir($dirname."/".$file))
unlink($dirname."/".$file);
else
delete_directory($dirname.'/'.$file);
}
}
closedir($dir_handle);
rmdir($dirname);
return true;
}
Este código se puede mejorar fácilmente, ya que es un truco rápido, pero toma un directorio como argumento y luego usa la recursión funcional para eliminar todos los archivos y carpetas dentro, y finalmente elimina el directorio. Agradable y rápido también.
Intenta usar parar para recorrer los archivos en el directorio para eliminar
foreach (glob('/path/to/directory/*') as $file){
unlink('/path/to/directory/' . $file);
}
Mira esto http://lixlpixel.org/recursive_function/php/recursive_directory_delete/
function recursive_remove_directory($directory, $empty=FALSE)
{
if(substr($directory,-1) == '/')
{
$directory = substr($directory,0,-1);
}
if(!file_exists($directory) || !is_dir($directory))
{
return FALSE;
}elseif(is_readable($directory))
{
$handle = opendir($directory);
while (FALSE !== ($item = readdir($handle)))
{
if($item != '.' && $item != '..')
{
$path = $directory.'/'.$item;
if(is_dir($path))
{
recursive_remove_directory($path);
}else{
unlink($path);
}
}
}
closedir($handle);
if($empty == FALSE)
{
if(!rmdir($directory))
{
return FALSE;
}
}
}
return TRUE;
}
Puedes eliminarlo recursivamente:
public function delete_folder ($path) {
$handle = opendir($path);
while ($file = readdir($handle)) {
if ($file != '..' && $file != '.') {
if (is_file($path . DS . $file))
unlink($path . DS . $file);
else
delete_folder($path . DS . $file);
}
}
closedir($handle);
rmdir($tmp_path);
}
delete_folder('path/to/folder');