Удаление всех файлов из папки с помощью PHP?

Например, у меня была папка под названием "Temp", и я хотел удалить или удалить все файлы из этой папки с помощью PHP. Могу ли я это сделать?

Ответ 1

$files = glob('path/to/temp/*'); // get all file names
foreach($files as $file){ // iterate files
  if(is_file($file))
    unlink($file); // delete file
}

Если вы хотите удалить скрытые файлы, такие как .htaccess, вы должны использовать

$files = glob('path/to/temp/{,.}*', GLOB_BRACE);

Ответ 2

Если вы хотите удалить все из папки (включая подпапки), используйте эту комбинацию array_map, unlink и glob:

array_map('unlink', glob("path/to/temp/*"));

Обновить

Этот вызов также может обрабатывать пустые каталоги - спасибо за подсказку, @mojuba!

array_map('unlink', array_filter((array) glob("path/to/temp/*")));

Ответ 3

Вот более современный подход, используя Стандартную библиотеку PHP (SPL).

$dir = "path/to/directory";
$di = new RecursiveDirectoryIterator($dir, FilesystemIterator::SKIP_DOTS);
$ri = new RecursiveIteratorIterator($di, RecursiveIteratorIterator::CHILD_FIRST);
foreach ( $ri as $file ) {
    $file->isDir() ?  rmdir($file) : unlink($file);
}
return true;

Ответ 4

foreach (new DirectoryIterator('/path/to/directory') as $fileInfo) {
    if(!$fileInfo->isDot()) {
        unlink($fileInfo->getPathname());
    }
}

Ответ 5

Этот код из http://php.net/unlink:

/**
 * Delete a file or recursively delete a directory
 *
 * @param string $str Path to file or directory
 */
function recursiveDelete($str) {
    if (is_file($str)) {
        return @unlink($str);
    }
    elseif (is_dir($str)) {
        $scan = glob(rtrim($str,'/').'/*');
        foreach($scan as $index=>$path) {
            recursiveDelete($path);
        }
        return @rmdir($str);
    }
}

Ответ 6

$dir = 'your/directory/';
foreach(glob($dir.'*.*') as $v){
    unlink($v);
}

Ответ 7

См READDIR и разъединить.

<?php
    if ($handle = opendir('/path/to/files'))
    {
        echo "Directory handle: $handle\n";
        echo "Files:\n";

        while (false !== ($file = readdir($handle)))
        {
            if( is_file($file) )
            {
                unlink($file);
            }
        }
        closedir($handle);
    }
?>

Ответ 8

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

Например, в linux я использую:

exec('rm -f '. $absolutePathToFolder .'*');

Или это, если вы хотите рекурсивное удаление без необходимости писать рекурсивную функцию

exec('rm -f -r '. $absolutePathToFolder .'*');

те же самые точные команды существуют для любой ОС, поддерживаемой PHP. Имейте в виду, что это способ удаления файлов. $absolutePathToFolder ДОЛЖЕН быть проверен и защищен перед запуском этого кода, и разрешения должны быть предоставлены.

Ответ 9

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

$files = glob('my_folder/*'); //get all file names
foreach($files as $file){
    if(is_file($file))
    unlink($file); //delete file
}

Получите этот исходный код отсюда - http://www.codexworld.com/delete-all-files-from-folder-using-php/

Ответ 10

Другое решение: Этот класс удаляет все файлы, подкаталоги и файлы в подкаталогах.

class Your_Class_Name {
    /**
     * @see http://php.net/manual/de/function.array-map.php
     * @see http://www.php.net/manual/en/function.rmdir.php 
     * @see http://www.php.net/manual/en/function.glob.php
     * @see http://php.net/manual/de/function.unlink.php
     * @param string $path
     */
    public function delete($path) {
        if (is_dir($path)) {
            array_map(function($value) {
                $this->delete($value);
                rmdir($value);
            },glob($path . '/*', GLOB_ONLYDIR));
            array_map('unlink', glob($path."/*"));
        }
    }
}

Ответ 11

Функция unlinkr рекурсивно удаляет все папки и файлы в указанном пути, убедившись, что она сама не удаляет script.

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('..', '.')))  {
            echo "<p>opening directory $file </p>";
            unlinkr($file, $pattern);
            //remove the directory itself
            echo "<p> deleting directory $file </p>";
            rmdir($file);
        } else if(is_file($file) and ($file != __FILE__)) {
            // make sure you don't delete the current script
            echo "<p>deleting file $file </p>";
            unlink($file); 
        }
    }
}

если вы хотите удалить все файлы и папки, в которые вы помещаете этот script, затем выполните его как

//get current working directory
$dir = getcwd();
unlinkr($dir);

если вы хотите просто удалить только файлы php, а затем вызвать его как

unlinkr($dir, "*.php");

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

unlinkr("/home/user/temp");

Это приведет к удалению всех файлов в каталоге home/user/temp.

Ответ 12

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

https://gist.github.com/4689551

Для использования:

Чтобы скопировать (или переместить) один файл или набор папок/файлов:

$files = new Files();
$results = $files->copyOrMove('source/folder/optional-file', 'target/path', 'target-file-name-for-single-file.only', 'copy');

Удалите один файл или все файлы и папки в пути:

$files = new Files();
$results = $files->delete('source/folder/optional-file.name');

Рассчитайте размер одного файла или набора файлов в наборе папок:

$files = new Files();
$results = $files->calculateSize('source/folder/optional-file.name');

Ответ 13

 <?
//delete all files from folder  & sub folders
function listFolderFiles($dir)
{
    $ffs = scandir($dir);
    echo '<ol>';
    foreach ($ffs as $ff) {
        if ($ff != '.' && $ff != '..') {
            if (file_exists("$dir/$ff")) {
                unlink("$dir/$ff");
            }
            echo '<li>' . $ff;
            if (is_dir($dir . '/' . $ff)) {
                listFolderFiles($dir . '/' . $ff);
            }
            echo '</li>';
        }
    }
    echo '</ol>';
}
$arr = array(
    "folder1",
    "folder2"
);
for ($x = 0; $x < count($arr); $x++) {
    $mm = $arr[$x];
    listFolderFiles($mm);
}
//end
?> 

Ответ 14

Для меня решение с readdir было лучшим и работало как шарм. С glob функция не работала в некоторых сценариях.

// Remove a directory recursively
function removeDirectory($dirPath) {
    if (! is_dir($dirPath)) {
        return false;
    }

    if (substr($dirPath, strlen($dirPath) - 1, 1) != '/') {
        $dirPath .= '/';
    }

    if ($handle = opendir($dirPath)) {

        while (false !== ($sub = readdir($handle))) {
            if ($sub != "." && $sub != ".." && $sub != "Thumb.db") {
                $file = $dirPath . $sub;

                if (is_dir($file)) {
                    removeDirectory($file);
                } else {
                    unlink($file);
                }
            }
        }

        closedir($handle);
    }

    rmdir($dirPath);
}

Ответ 15

Я обновил ответ @Stichoza, чтобы удалить файлы через подпапки.

function glob_recursive($pattern, $flags = 0) {
    $fileList = glob($pattern, $flags);
    foreach (glob(dirname($pattern).'/*', GLOB_ONLYDIR|GLOB_NOSORT) as $dir) {
        $subPattern = $dir.'/'.basename($pattern);
        $subFileList = glob_recursive($subPattern, $flags);
        $fileList = array_merge($fileList, $subFileList);
    }
    return $fileList;
}

function glob_recursive_unlink($pattern, $flags = 0) {
    array_map('unlink', glob_recursive($pattern, $flags));
}

Ответ 16

public static function recursiveDelete($dir)
{
    foreach (new \DirectoryIterator($dir) as $fileInfo) {
        if (!$fileInfo->isDot()) {
            if ($fileInfo->isDir()) {
                recursiveDelete($fileInfo->getPathname());
            } else {
                unlink($fileInfo->getPathname());
            }
        }
    }
    rmdir($dir);
}

Ответ 17

Там есть пакет под названием "Pusheh", который поможет вам полностью удалить каталог (ссылка на Github). Он также доступен на Packagist.

Например, если вы хотите очистить каталог Temp, вы можете сделать:

Pusheh::clearDir("Temp");

// Or you can remove the directory completely
Pusheh::removeDirRecursively("Temp");

Если вам интересно, посмотрите вики.