Я ищу сценарий, чтобы перебирать папку и удалять все файлы внутри нее, но последние, самые последние (я обозначил имя каждого файла как filename_date('Y')_date('m')_date('d').extension)
, не уверены, если это необходимо).
Я нашел этот скрипт здесь в стеке:
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]); } }
Это выше удаляет все, кроме последних пяти. Это хороший способ сделать это? Или есть другой способ, более простой или лучший?
Это работает. Я не верю, что есть более простой способ сделать это. Кроме того, ваше решение на самом деле довольно простое.
я думаю, это хорошее решение. просто измените цикл
но вы могли бы избежать для сортировки массива циклов в режиме спуска, чтобы вы могли удалить все остальные массивы, сохраняя только первый файл EDIT sort от самого нового до более старого
Я знаю, что это старо, но вы тоже можете это сделать
$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); } }