2012-02-20 3 views
1
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 

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

+0

1) для каждого файла разъединить 2) выполнить гт -rf –

+2

хороший SQL аналогии:> –

+0

HAHA это то, что я видел в коде тоже. Мне было интересно, кто-то потянет меня за это. – TheBlackBenzKid

ответ

1

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

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

может путь dir есть подпапки и субфайлы внутри .. может ли конец dirPath с завершающей косой чертой? – TheBlackBenzKid

+0

да, он мог бы иметь и код очистил бы все. –

+0

вы можете объяснить эту строку? if (substr ($ dirPath, strlen ($ dirPath) - 1, 1) = «/») { $ dirPath = «/»;. }! – TheBlackBenzKid

1

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

foreach (glob('/path/to/directory/*') as $file){ 
    unlink('/path/to/directory/' . $file); 
} 
+0

это не сработает в случае отсутствия пустых каталогов внутри целевого каталога –

+0

Это только один уровень глубины! Поэтому он не будет работать, если есть два или более уровней :( – Westie

+0

эта функция также потребляет много памяти. Проверьте http://www.php.net/manual/en/function.glob.php#102931 –

2

использование этого

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

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

+0

ли $ имя_каталога должны заканчиваться косой слэш – TheBlackBenzKid

+0

не просто передать имя каталога –

+0

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

0

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

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

Проверить это 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; 
    } 
Смежные вопросы