Я могу использовать 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); ?>