Удалить каталог не пустой - PullRequest
1 голос
/ 20 февраля 2012
rmdir("./uploads/temp/".$user."/");

У меня есть много файлов в каталоге, которые я хочу удалить в своем PHP-скрипте, однако для меня это не первый способ отсоединить () файл. Есть ли способ, которым я могу сделать

unlink(* FROM (dir=)) // don't downvote the long shot
// delete all files from the dir first
// then delete that dir 

Ссылка на каталог должна быть пустой, чтобы удалить его, см. php.net / manual / en / function.rmdir.php

Ответы [ 6 ]

2 голосов
/ 20 февраля 2012

используйте это

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

Этот код может быть легко улучшен, поскольку это быстрый взлом, но он принимает каталог в качестве аргумента, а затем использует функциональную рекурсию для удаления всех файлов и папок внутри, изатем, наконец, удаляет каталог.Красиво и быстро тоже.

2 голосов
/ 20 февраля 2012

Вы можете использовать DirectoryIterator и unlink вместе.

1 голос
/ 20 февраля 2012

Проверьте это 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;
    }
1 голос
/ 20 февраля 2012

Нет другого способа, кроме как сначала удалить все файлы тем или иным способом, а затем удалить каталог.

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);
}
1 голос
/ 20 февраля 2012

Попробуйте использовать glob , чтобы перебрать файлы в каталоге для удаления

foreach (glob('/path/to/directory/*') as $file){
    unlink('/path/to/directory/' . $file);
}
0 голосов
/ 20 февраля 2012

Вы можете удалить его рекурсивно:

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');
...