PHP: Отключите все файлы в каталоге и затем удалите этот каталог

Я могу использовать RegExp или Wildcard для быстрого удаления всех файлов в папке, а затем удалить эту папку на PHP, БЕЗ использования команды «exec»? Мой сервер не дает мне разрешения на использование этой команды. Достаточно простой петли.

Мне нужно что-то, что выполнило бы логику следующего утверждения, но, очевидно, было бы справедливо:

$dir = "/home/dir" unlink($dir . "/*"); # "*" being a match for all strings rmdir($dir); 

Используйте glob чтобы найти все файлы, соответствующие шаблону.

 function recursiveRemoveDirectory($directory) { foreach(glob("{$directory}/*") as $file) { if(is_dir($file)) { recursiveRemoveDirectory($file); } else { unlink($file); } } rmdir($directory); } 

Используйте glob() чтобы легко прокручивать каталог, чтобы удалить файлы, после чего вы можете удалить каталог.

 foreach (glob($dir."/*.*") as $filename) { if (is_file($filename)) { unlink($filename); } } rmdir($dir); 

Функция glob() делает то, что вы ищете. Если вы используете PHP 5.3+, вы можете сделать что-то вроде этого:

 $dir = ... array_walk(glob($dir . '/*'), function ($fn) { if (is_file($fn)) unlink($fn); }); unlink($dir); 

Попробуйте простой способ:

 $dir = "/home/dir"; array_map('unlink', glob($dir."/*")); rmdir($dir); 

В функции для удаления 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"); 

Простой и эффективный способ рекурсивного удаления всех файлов и папок с помощью стандартной библиотеки PHP , в частности, RecursiveIteratorIterator и RecursiveDirectoryIterator . Дело в флагом RecursiveIteratorIterator::CHILD_FIRST , итератор будет сначала RecursiveIteratorIterator::CHILD_FIRST файлы и каталог в конце, поэтому, как только каталог пуст, можно использовать 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' ); 

Вы можете использовать компонент Symfony Filesystem , чтобы избежать повторного создания колеса, чтобы вы могли делать

 use Symfony\Component\Filesystem\Filesystem; $filesystem = new Filesystem(); if ($filesystem->exists('/home/dir')) { $filesystem->remove('/home/dir'); } 

Если вы предпочитаете самостоятельно управлять кодом, вот кодовая база Symfony для соответствующих методов

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

Один из способов сделать это:

 function unlinker($file) { unlink($file); } $files = glob('*.*'); array_walk($files,'unlinker'); rmdir($dir); 

для удаления всех файлов вы можете удалить каталог и сделать снова .. с простой строкой кода

 <?php $dir = '/home/files/'; rmdir($dir); mkdir($dir); ?>