2014-11-17 5 views
0

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

Что такое хороший способ удалить старые файлы журналов?

В настоящее время я Переберите директорию для чтения файлов

File[] listOfFiles = srcFolder.listFiles(fileNameFilter); // this makes an array of files which match a filter I created 
for(int i=listOfFiles.length-1; i>0; i--){ // leave at least one file 

    // listOfFiles[i].lastModified() - in last ten days? 
    if(what condition ?){ 
     try { 
      listOfFiles[i].delete(); 
     } catch(Exception e){ 

     } 
    } 
} 

Я думаю

if(listOfFiles[i].lastModified() < tenDaysAgoMS) // where tenDaysAgoMS is the milliseconds ten days ago, but how to implement? 
+3

Я не понимаю, почему ваше предлагаемое решение не сработает. Ты это пробовал? – Zymus

+0

Нет. Я не был уверен, как лучше всего реализовать его, просто сравните сегодня как (новая дата()). GetTime()? – SoluableNonagon

+2

Нет, я бы хотел что-то вроде 'long now = System.currentTimeMillis();' И тогда просто сравните это значение с значением 'lastModified()'. если это более 10 дней, то удалите. – Zymus

ответ

2

Во-первых, вы должны вычесть свойство последнего изменения до текущего времени. См. Calendar.getTimeInMillis() и File.lastModified().

Затем вы можете конвертировать дни в миллисекунды, умножив их на 1000 * 60 * 60 * 24.

  1. 1000ms = 1s

  2. 60s = 1m

  3. 60m = 1h

  4. 24h = 1d


long now = Calendar.getInstance().getTimeInMillis(); 
long oneDay = 1000L * 60L * 60L * 24L; 
long tenDays = 10L * oneDay; 

File log = listOfFiles[i]; 
long diff = now - log.lastModified(); 
if (diff > tenDays) { 
    log.delete(); 
} 
2

вы могли бы сделать что-то вроде

if((System.currentTimeMillis() - listOfFiles[i].lastModified()) > 10 * 24 * 60 * 60 * 1000){ 
} 
+0

+1 потому что вы использовали все номера, чтобы понять, что вы делаете. – Charlie

+0

Мне нравится решение, но я думаю, что круглые скобки немного меньше – SoluableNonagon

+1

Кроме того, было бы более эффективно вытягивать расчет времени (10 * 24 * 60 * 60 * 1000) вне инструкции if, поскольку мы знаем, что это будет быть постоянным? – SoluableNonagon

1

Используйте инструменты в вашем распоряжении. Это намного яснее, чем игра с миллисекундами и тому подобное. Я даю ответ с Java Calendar, потому что я понимаю, что вам не нужна внешняя библиотека, например, Joda Time, так как задача довольно проста. Если у вас есть Java 8, используйте API java.time.

Calendar tenDaysAgo = Calendar.getInstance(); 
tenDaysAgo.add(Calendar.DAY_OF_MONTH, -10); // yeah, Calendar is really not a good API. 

File[] listOfFiles = srcFolder.listFiles(fileNameFilter); 
for(int i = listOfFiles.length - 1; i > 0; i--){ // leave at least one file 
    File file = listOfFiles[i]; 
    Calendar fileDate = Calendar.getInstance(); 
    fileDate.setTime(new Date(file.lastModified())); 
    if (fileDate.before(tenDaysAgo)) { 
     try { 
      file.delete(); 
     } catch (IOException e) { 
      // handle the error 
     } 
    } 
} 
+0

Спасибо, я пытался использовать это на ранней стадии, но я чувствовал, что это более громоздко, чем ответы, использующие системное время и сравнивающие это с временным интервалом. – SoluableNonagon

+0

Громоздкий? Вы говорите о 4-5 строках кода, которые довольно быстры. Хорошо, это никогда не превзойдет скорость его вычисления вручную, но поскольку это сценарий, вам действительно нужно выиграть половину миллисекунды за меньшую удобочитаемость? –

1

Более точный

Как конкретные ваши требования? Другие ответы достаточно хороши примерно на десять дней. Но если вы имеете в виду нечто более точное, например, за десять полных дней до сегодняшнего дня, вам нужно использовать библиотеку Joda-Time или новый пакет java.time, встроенный в Java 8 (вдохновленный Joda-Time).

Получите первый миг дня, позвонив по номеру withTimeAtStartOfDay. Обычно это 00:00:00.000, но не всегда.

Насколько важен часовой пояс. Если этот параметр опущен, вы получаете текущий часовой пояс JVM. Обычно лучше указать желаемый часовой пояс. Возможно, вам нужен UTC для согласованности.

Joda времени

Пример кода в Joda-Time 2.5.

DateTimeZone zone = DateTimeZone.forID("America/Montreal"); // or DateTimeZone.UTC 
DateTime now = DateTime.now(zone); 
DateTime then = now.minusDays(10).withTimeAtStartOfDay(); 
long millisSinceEpoch = then.getMillis(); // If needed to compare to files. 
+0

спасибо за ответ, этот уровень точности не требуется (я считаю), но я мог ошибаться. – SoluableNonagon