Удалить все файлы внутри папки, кроме последней? - PullRequest
2 голосов
/ 02 февраля 2012

Я ищу скрипт для циклического перемещения по папке и удаления всех файлов внутри нее, кроме последнего, самого последнего (я пометил имя каждого файла как filename_date('Y')_date('m')_date('d').extension), не уверен, если это уместно). 1002 *

Я нашел этот скрипт здесь в стеке:

if ($handle = opendir('/path/to/your/folder')) 
{
    $files = array();
    while (false !== ($file = readdir($handle))) 
    {
        if (!is_dir($file))
        {
            // You'll want to check the return value here rather than just blindly adding to the array
            $files[$file] = filemtime($file);
        }
    }

    // Now sort by timestamp (just an integer) from oldest to newest
    asort($files, SORT_NUMERIC);

    // Loop over all but the 5 newest files and delete them
    // Only need the array keys (filenames) since we don't care about timestamps now as the array will be in order
    $files = array_keys($files);
    for ($i = 0; $i < (count($files) - 5); $i++)
    {
        // You'll probably want to check the return value of this too
        unlink($files[$i]);
    }
}

Это выше удаляет все, кроме последних пяти. Это хороший способ сделать это? Или есть другой способ, проще или лучше?

Ответы [ 3 ]

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

Это работает. Я не верю, что есть более простой способ сделать это. Кроме того, ваше решение на самом деле довольно просто.

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

Я думаю, это хорошее решение. просто измените цикл

но вы могли бы избежать сортировки цикла в массиве по убыванию, чтобы вы могли удалить все остальные массивы, сохранив только первый файл РЕДАКТИРОВАТЬ сортировать от новейшего к старшему

0 голосов
/ 22 августа 2017

я знаю, что это старый, но вы могли бы сделать это так

$directory = array_diff(scandir(pathere), array('..', '.'));
$files = [];
foreach ($directory as $key => $file) {
    $file = pathere.$file;
    if (file_exists($file)) {
        $name = end(explode('/', $file));
        $timestamp = preg_replace('/[^0-9]/', '', $name);
        $files[$timestamp] = $file;
    }
}
// unset last file
unset( $files[max(array_keys($files))] );
// delete old files
foreach ($files as $key => $dfiles) {
    if (file_exists($dfiles)) {
        unlink($dfiles);
    }
}
...