2012-02-02 3 views
2

Я ищу сценарий, чтобы перебирать папку и удалять все файлы внутри нее, но последние, самые последние (я отметил имя каждого файла как 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]); 
    } 
} 

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

ответ

2

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

1

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

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

0

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

$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); 
    } 
} 
Смежные вопросы