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

Java 删除过去十天内未修改的所有文件,java,last-modified,delete-file,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

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

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

目前,我在目录中循环读取文件

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?
if(listOfFiles[i].lastModified()
您可以执行以下操作

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

你可以这样做

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

首先,必须将上次修改的属性减去当前时间。 见和

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

  • 1000ms
    =
    1s

  • 60s
    =
    1m

  • 60m
    =
    1h

  • 24h
    =
    1d



  • 首先,必须将上次修改的属性减去当前时间。 见和

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

  • 1000ms
    =
    1s

  • 60s
    =
    1m

  • 60m
    =
    1h

  • 24h
    =
    1d



  • 使用你可以使用的工具。这比玩毫秒之类的游戏要清楚得多。我用Java的
    日历
    给出了一个答案,因为我知道您不需要任何像Joda Time这样的外部库,因为任务非常简单。如果您有Java8,请使用
    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
            }
        }
    }
    

    使用你可以使用的工具。这比玩毫秒之类的游戏要清楚得多。我用Java的
    日历
    给出了一个答案,因为我知道您不需要任何像Joda Time这样的外部库,因为任务非常简单。如果您有Java8,请使用
    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
            }
        }
    }
    
    更精确 你的要求有多具体?其他答案足够用十天左右。但是,如果您指的是更精确的内容,例如今天之前整整十天,那么您需要使用Joda Time库或java 8中内置的新java.Time包(受Joda Time启发)

    通过调用
    with timeatstartofday
    获取一天中的第一个时刻。这通常是
    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.
    
    更精确 你的要求有多具体?其他答案足够用十天左右。但是,如果您指的是更精确的内容,例如今天之前整整十天,那么您需要使用Joda Time库或java 8中内置的新java.Time包(受Joda Time启发)

    通过调用
    with timeatstartofday
    获取一天中的第一个时刻。这通常是
    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.
    


    我不明白你提出的解决方案为什么行不通。你试过了吗?不,我不确定如何最好地实现它,只需将今天作为(new Date()).getTime()进行比较即可。不,我希望类似于
    long now=System.currentTimeMillis()
    然后将该值与
    lastModified()
    值进行比较。如果超过10天,则删除。我不明白为什么您提出的解决方案不起作用。你试过了吗?不,我不确定如何最好地实现它,只需将今天作为(new Date()).getTime()进行比较即可。不,我希望类似于
    long now=System.currentTimeMillis()
    然后将该值与
    lastModified()
    值进行比较。如果超过10天,则删除+1,因为您使用了所有分隔的数字来清楚说明您在做什么。我喜欢这个解决方案,但我认为括号有点小。因此,将时间计算(10*24*60*60*1000)拉到if语句之外是否更有效,因为我们知道它是常数?+1,因为你使用了所有分开的数字来明确你在做什么。我喜欢这个解决方案,但我认为括号有点偏了。所以,将时间计算(10*24*60*60*1000)拉到if语句之外会更有效吗,因为我们知道它是恒定的?谢谢你的回答,这个精度水平不是必需的(我相信),但我可能错了。谢谢你的回答,这个精度水平不是必需的(我相信),但我可能错了。谢谢,我很早就试着用这个,但我觉得这比使用系统时间并将其与时间跨度进行比较的答案更麻烦。麻烦吗?你说的是4-5行代码,相当快。好的,这永远都比不上手工计算的速度,但是因为它是一个脚本,你真的需要以更少的可读性赢得半毫秒的增益吗?谢谢,我很早就尝试过使用它,但我觉得它比使用系统时间并将其与时间跨度进行比较的答案更麻烦。麻烦吗?你说的是4-5行代码,相当快。好的,这永远不会超过手工计算的速度,但是因为它是一个脚本,你真的需要为更少的可读性赢得半毫秒的增益吗?