Java删除超过N天的文件

时间:2011-07-28 22:48:52

标签: java file file-management

我想要一些Java代码来删除超过N天的文件。

这是我的尝试,但它不能正常工作。

public void deleteFilesOlderThanNdays(final int daysBack, final String dirWay) {

    System.out.println(dirWay);
    System.out.println(daysBack);

    final File directory = new File(dirWay);
    if(directory.exists()){
        System.out.println(" Directory Exists");
        final File[] listFiles = directory.listFiles();          
        final long purgeTime = 
            System.currentTimeMillis() - (daysBack * 24 * 60 * 60 * 1000);

        System.out.println("System.currentTimeMillis " + 
            System.currentTimeMillis());

        System.out.println("purgeTime " + purgeTime);

        for(File listFile : listFiles) {
            System.out.println("Length : "+ listFiles.length);
            System.out.println("listFile.getName() : " +listFile.getName());
            System.out.println("listFile.lastModified() :"+
                listFile.lastModified());

            if(listFile.lastModified() < purgeTime) {
                System.out.println("Inside File Delete");
            }
        }
    } 
    else 
    {
    }
}

是否有一些简单的代码可以删除目录中N天以前的文件?

7 个答案:

答案 0 :(得分:10)

尝试使用Calendar - Class:

 Calendar cal = Calendar.getInstance();  
 cal.add(Calendar.DAY_OF_MONTH, daysBack * -1);  
 long purgeTime = cal.getTimeInMillis();   

或尝试this solution

您的天数是否超过24?如果是这样,你就会出现溢出问题。

如果天数为25,则值为:

25 * 24 * 60 * 60 * 1000

数学值为2160000000。但是,这大于Integer.MAX_VALUE,因此值溢出 -12516353。因此,清除时间将在未来,永远不会得到满足。大于25的值只会使问题变得更糟;甚至可能溢出是如此糟糕,以至于乘法再次产生正值,导致可能清除所有文件。

修复很简单:

  1. daysBack声明为long
  2. daysBack投射到long

    long purgeTime = System.currentTimeMillis() - ((long)daysBack * 24 * 60 * 60 * 1000);  
    
  3. 在计算中使用显式长文字:

    long purgeTime = System.currentTimeMillis() - (daysBack * 24L * 60L * 60L * 1000L); 
    
  4. 对于所有三个解决方案,第一个和/或第二个操作数为long的事实将整个结果转换为long,允许值2160000000而不会溢出。

答案 1 :(得分:5)

我使用这个简单的代码段来删除超过N天的文件

在此代码段中,删除基于文件最后修改日期时间

daysBack =删除超过N天的文件
dirWay =包含文件的目录

public static void deleteFilesOlderThanNdays(int daysBack, String dirWay) {

File directory = new File(dirWay);
if(directory.exists()){

    File[] listFiles = directory.listFiles();           
    long purgeTime = System.currentTimeMillis() - (daysBack * 24 * 60 * 60 * 1000);
    for(File listFile : listFiles) {
        if(listFile.lastModified() < purgeTime) {
            if(!listFile.delete()) {
                System.err.println("Unable to delete file: " + listFile);
            }
         }
      }
   }
}

由于

答案 2 :(得分:1)

用于删除N天以前目录中的文件的Java程序:

对于您不小心用此擦除硬盘计算机,我不负责任。除非你了解它的作用以及它为什么这样做,否则不要运行它。如果您不小心对root或某个敏感目录运行此文件,旧文件将被永久删除。

此Java程序将收集C:\Users\penguins中包含文本名称MyLogFile_的所有文件的列表。它查看每个文件的lastModified()日期,并查看它的年龄(以毫秒为单位),如果差异大于指定的天数(8天,以毫秒为单位),则删除该文件。

import java.io.File;
import java.util.*;

class Runner{
    public static void main(String[] args){

        long numDays = 8;   //this needs to be a long.

        //WARNING!  OLD FILES IN THIS DIRECTORY WILL BE DELETED.
        String dir = "C:\\Users\\penguins";
        //IF YOU ACCIDENTALLY POINT THIS TO C:\\Windows or other sensitive
        //directory (and run it) you will be living in the house of pain.

        File directory = new File(dir);
        File[] fList = directory.listFiles();

        if (fList != null){
            for (File file : fList){
                if (file.isFile() &&
                    file.getName().contains("MyLogFile_")){

                    long diff = new Date().getTime() - file.lastModified();
                    long cutoff = (numDays * (24 * 60 * 60 * 1000));

                    if (diff > cutoff) {
                      file.delete();
                    }
                }
            }
        }
    }
}

要使此代码适合您,您需要:

  1. 将目录设置为要从中删除文件的目录。
  2. 将numDays变量设置为删除文件的天数。
  3. MyLogFile_字词设置为您要删除的文件的签名。将其设置为空白以查看所有文件。
  4. 当此代码失败时:

    如果系统日期更改为将来或过去,(或某些奇怪的闰秒,时区更改或系统日期编辑)发生,则可能会发生删除横行。如果文件上的日期被人为操纵,那么这可能会继续删除横行。如果权限对文件的限制太多,则不会删除该文件。

答案 3 :(得分:0)

您可以使用file.lastModified()方法

有些事情如下。

文件档案=新档案(“YOUR_FOLDER_PATH”);

long diff = new Date().getTime() - file.lastModified();

 if (diff > Z * 24 * 60 * 60 * 1000) {
  file.delete();
 }

答案 4 :(得分:0)

如果您的意思是“大约30天前”,其他答案都是正确的。但如果你的意思更精确,那么你应该注意时区。如果你的意思是整天,请注意时间。

如果您想使用UTC / GMT,请使用此时区对象:DateTimeZone.UTC

以下是使用Joda-Time 3.2库的示例代码。

DateTimeZone timeZone = DateTimeZone.forID( "Europe/Oslo" );

DateTime now = new DateTime( timeZone );
DateTime cutoff = now.minusDays( 30 ).withTimeAtStartOfDay();

DateTime fileCreationDateTime = new DateTime( 2014, 1, 2, 3, 4, 5, timeZone );
boolean fileShouldBeDeleted = fileCreationDateTime.isBefore( cutoff );

DateTime file2CreationDateTime = now.minusMinutes( 1 );
boolean file2ShouldBeDeleted = file2CreationDateTime.isBefore( cutoff );

转储到控制台...

System.out.println( "now: " + now );
System.out.println( "cutoff: " + cutoff );
System.out.println( "fileCreationDateTime: " + fileCreationDateTime );
System.out.println( "fileShouldBeDeleted: " + fileShouldBeDeleted );
System.out.println( "file2CreationDateTime: " + file2CreationDateTime );
System.out.println( "file2ShouldBeDeleted: " + file2ShouldBeDeleted );

跑步时......

now: 2014-02-07T07:20:32.898+01:00
cutoff: 2014-01-08T00:00:00.000+01:00
fileCreationDateTime: 2014-01-02T03:04:05.000+01:00
fileShouldBeDeleted: true
file2CreationDateTime: 2014-02-07T07:19:32.898+01:00
file2ShouldBeDeleted: false

答案 5 :(得分:0)

使用Java 8的代码段

    public static void deleteFilesOlderThanNdays(int daysAgo, String destDir) throws IOException {

    Instant instantDaysAgo = Instant.from(ZonedDateTime.now().minusDays(daysAgo));

    BiPredicate<Path, BasicFileAttributes> fileIsOlderThanNDays = 
            (path, attr) ->  attr.lastModifiedTime().compareTo( FileTime.from(instantDaysAgo)) < 0 ;


    List<Path> filesToDelete = (List) Files.find(Paths.get(destDir), 1 , fileIsOlderThanNDays )
                                            .collect(Collectors.toList());


    for (Path path : filesToDelete) {
            Files.delete(path);
        }
}

答案 6 :(得分:0)

我正在研究类似的东西,我包装了一些 java.nio.file.Files 方法,以便拥有一个干净的基于 Java 8 流的方法。

我的需求是 7 天,但您可以根据需要进行调整:

public void cleanFilesOlderThan7Days() {
    try {
        Files.walk(Paths.get("temp/raw_reports"))
                .filter(Files::isRegularFile)
                .filter(FilesUtils::isOlderThan7Days)
                .forEach(FilesUtils::delete);
    } catch (IOException e) {
        log.error("Could not clean old files", e);
    }
}

我将包装的方法放在一个 utils 类中:

公共类 FilesUtils {

@SneakyThrows
public static boolean isOlderThan7Days(java.nio.file.Path path) {
    FileTime lastModifiedTime = Files.getLastModifiedTime(path);
    Duration interval = Duration.between(lastModifiedTime.toInstant(), Instant.now());
    return interval.toDays() > 7;
}

@SneakyThrows
public static void delete(java.nio.file.Path path) {
    Files.delete(path);
}

}

请注意,我正在使用 Lombok 插件中的 @SneakyThrows。如果您不使用它,您可以实现它或使用 try/catch 来威胁异常。