Java Удалить файлы старше N дней - PullRequest
2 голосов
/ 29 июля 2011

Я хотел бы, чтобы некоторый 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 дней?

Ответы [ 6 ]

11 голосов
/ 29 июля 2011

Попробуйте вместо этого использовать Календарь -Класс:

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

Или попробуйте это решение :

Ваше количество дней превышает 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); 
    

Для всех трех решений тот факт, что первый и / или второй операнд является длинным, превращает весь результат в длинный, допуская значение 2160000000 без переполнения.

5 голосов
/ 23 февраля 2015

Я использую этот простой фрагмент кода для удаления файлов старше 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);
            }
         }
      }
   }
}

Спасибо

1 голос
/ 21 августа 2014

Java-программа для удаления файлов в каталоге старше N дней:

Я не несу ответственности за то, что вы случайно удалили компьютер с этим жестким диском.Не запускайте его, если не понимаете, что он делает и почему он это делает.Если вы случайно запустите этот файл для корневого или какого-либо конфиденциального каталога, старые файлы будут удалены безвозвратно.

Эта программа на 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_ для подписи файлов, которые вы хотите удалить.Установите это значение пустым, чтобы просмотреть все файлы.

Когда этот код не удастся вам:

Если системная дата изменяется на будущее или прошлое, (или происходит какая-то странная високосная секунда, изменение часового пояса или редактирование системной даты), тогда это может привести к безудержному удалению.Если даты в файлах искусственно манипулируются, то это может привести к разрушительному буйству.Если права доступа к файлам слишком ограничены, файл не будет удален.

0 голосов
/ 15 июля 2019

Фрагмент кода с использованием 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);
        }
}
0 голосов
/ 07 февраля 2014

Если вы имеете в виду «примерно 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
0 голосов
/ 07 февраля 2014

Вы можете использовать метод file.lastModified ()

Что-то похожее на приведенное ниже.

Файл файл = новый файл ("YOUR_FOLDER_PATH");

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

 if (diff > Z * 24 * 60 * 60 * 1000) {
  file.delete();
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...