删除过去十天内未修改的所有文件

时间:2014-11-17 16:56:23

标签: java last-modified delete-file

我有一个文件夹,我保存日志文件,我有一个工作计划每天运行删除旧日志。

删除旧日志文件的好方法是什么?

目前,我遍历目录以读取文件

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?

4 个答案:

答案 0 :(得分:2)

你可以做点什么

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

答案 1 :(得分:2)

首先,您必须将最后修改的属性减去当前时间。 请参阅Calendar.getTimeInMillis()File.lastModified()

然后,您可以将天数乘以1000 * 60 * 60 * 24来将天数转换为毫秒。

  1. 1000ms = 1s

  2. 60s = 1m

  3. 60m = 1h

  4. 24h = 1d


  5. 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 :(得分:1)

使用您可以使用的工具。它比玩毫秒和类似的事情要清楚得多。我用Java Calendar给出答案,因为我知道你不应该像Joda Time那样需要任何外部库,因为任务非常简单。如果您使用的是Java 8,请使用java.time API。

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
        }
    }
}

答案 3 :(得分:1)

更精确

您的要求有多具体?其他答案足够大约十天。但是如果你的意思更精确,比如今天前十天,那么你需要使用Joda-Time库或Java 8中内置的新java.time包(受Joda-Time启发)。

通过致电withTimeAtStartOfDay获取当天的第一时刻。这通常是00:00:00.000,但并非总是如此。

时区有多重要。如果省略,则获取JVM的当前默认时区。通常更好地指定所需的时区。也许你想要UTC的一致性。

约达时间

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.