java删除超过7天的文件夹_关于Java:删除X天之前的文件

我想找出使用Java创建文件的时间,因为我希望删除某个时间段之前的文件,目前我正在删除目录中的所有文件,但这并不理想:

public void DeleteFiles() {

File file = new File("D:/Documents/NetBeansProjects/printing~subversion/fileupload/web/resources/pdf/");

System.out.println("Called deleteFiles");

DeleteFiles(file);

File file2 = new File("D:/Documents/NetBeansProjects/printing~subversion/fileupload/Uploaded/");

DeleteFilesNonPdf(file2);

}

public void DeleteFiles(File file) {

System.out.println("Now will search folders and delete files,");

if (file.isDirectory()) {

for (File f : file.listFiles()) {

DeleteFiles(f);

}

} else {

file.delete();

}

}

上面是我当前的代码,我现在尝试在其中添加一个if语句,该语句只会删除早于一周的文件。

编辑:

@ViewScoped

@ManagedBean

public class Delete {

public void DeleteFiles() {

File file = new File("D:/Documents/NetBeansProjects/printing~subversion/fileupload/web/resources/pdf/");

System.out.println("Called deleteFiles");

DeleteFiles(file);

File file2 = new File("D:/Documents/NetBeansProjects/printing~subversion/fileupload/Uploaded/");

DeleteFilesNonPdf(file2);

}

public void DeleteFiles(File file) {

System.out.println("Now will search folders and delete files,");

if (file.isDirectory()) {

System.out.println("Date Modified :" + file.lastModified());

for (File f : file.listFiles()) {

DeleteFiles(f);

}

} else {

file.delete();

}

}

现在添加循环。

编辑

我在测试上面的代码时注意到,我在中进行了最后修改:

INFO: Date Modified : 1361635382096

如果采用上述格式,应该如何编码if循环以说明是否已超过7天,请删除它?

您可以使用File.lastModified()来获取文件/目录的最后修改时间。

可以这样使用:

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

if (diff > x * 24 * 60 * 60 * 1000) {

file.delete();

}

删除超过x天(int)天的文件。

谢谢:)会调查一下

它将给出最后的修改时间而不是文件创建时间。

很好,创建文件后就不能对其进行修改,没有人可以编辑它:)

:D那真的很简单。我正在写ans文件创建时间。 ;)

谢谢 ! :)正在测试atm,但到目前为止看起来很完美!

Commons IO内置支持使用AgeFileFilter按年龄过滤文件。您的DeleteFiles可能看起来像这样:

import java.io.File;

import org.apache.commons.io.FileUtils;

import org.apache.commons.io.filefilter.AgeFileFilter;

import static org.apache.commons.io.filefilter.TrueFileFilter.TRUE;

// a Date defined somewhere for the cutoff date

Date thresholdDate = ;

public void DeleteFiles(File file) {

Iterator filesToDelete =

FileUtils.iterateFiles(file, new AgeFileFilter(thresholdDate), TRUE);

for (File aFile : filesToDelete) {

aFile.delete();

}

}

更新:要使用编辑中给定的值,请将thresholdDate定义为:

Date tresholdDate = new Date(1361635382096L);

更新以显示如何处理编辑中给定的值。

有什么方法可以将AgeFileFilter与另一个过滤器(例如NameFileFilter)组合在一起?

@NathanChristie参见AndFileFilter和OrFileFilter

参数:iterateFiles(文件目录,IOFileFilter fileFilter,IOFileFilter dirFilter),dirfilter是可选的(可以为null)

使用Java 8的Time API的示例

LocalDate today = LocalDate.now();

LocalDate eailer = today.minusDays(30);

Date threshold = Date.from(eailer.atStartOfDay(ZoneId.systemDefault()).toInstant());

AgeFileFilter filter = new AgeFileFilter(threshold);

File path = new File("...");

File[] oldFolders = FileFilterUtils.filter(filter, path);

for (File folder : oldFolders) {

System.out.println(folder);

}

使用Apache utils可能是最简单的。这是我能想到的最简单的解决方案。

public void deleteOldFiles() {

Date oldestAllowedFileDate = DateUtils.addDays(new Date(), -3); //minus days from current date

File targetDir = new File("C:\\TEMP\\archive\");

Iterator filesToDelete = FileUtils.iterateFiles(targetDir, new AgeFileFilter(oldestAllowedFileDate), null);

//if deleting subdirs, replace null above with TrueFileFilter.INSTANCE

while (filesToDelete.hasNext()) {

FileUtils.deleteQuietly(filesToDelete.next());

}  //I don't want an exception if a file is not deleted. Otherwise use filesToDelete.next().delete() in a try/catch

}

还值得注意的是,您可以使用毫秒创建像这样的new AgeFileFilter(System.currentTimeMillis() - AGE_LIMIT_MILLIS)的AgeFileFilter,其中AGE_LIMIT_MILLIS可以说是24 * 60 * 60 * 1000L 24小时。

@MattC如果我将其用于具有2或3百万条记录的目录,是否会产生诸如内存不足异常的影响?

@Diwa是的,我想如果您有数百万个文件,可能会遇到内存问题。 FileUtils创建一个java.util.LinkedList,然后返回该列表的迭代器。

使用Lambda(Java 8+)

非递归选项,用于删除当前文件夹中超过N天的所有文件(忽略子文件夹):

public static void deleteFilesOlderThanNDays(int days, String dirPath) throws IOException {

long cutOff = System.currentTimeMillis() - (days * 24 * 60 * 60 * 1000);

Files.list(Paths.get(dirPath))

.filter(path -> {

try {

return Files.isRegularFile(path) && Files.getLastModifiedTime(path).to(TimeUnit.MILLISECONDS) < cutOff;

} catch (IOException ex) {

// log here and move on

return false;

}

})

.forEach(path -> {

try {

Files.delete(path);

} catch (IOException ex) {

// log here and move on

}

});

}

递归选项,它遍历子文件夹并删除所有早于N天的文件:

public static void recursiveDeleteFilesOlderThanNDays(int days, String dirPath) throws IOException {

long cutOff = System.currentTimeMillis() - (days * 24 * 60 * 60 * 1000);

Files.list(Paths.get(dirPath))

.forEach(path -> {

if (Files.isDirectory(path)) {

try {

recursiveDeleteFilesOlderThanNDays(days, path.toString());

} catch (IOException e) {

// log here and move on

}

} else {

try {

if (Files.getLastModifiedTime(path).to(TimeUnit.MILLISECONDS) < cutOff) {

Files.delete(path);

}

} catch (IOException ex) {

// log here and move on

}

}

});

}

这是使用Time API的Java 8版本。它已在我们的项目中经过测试和使用:

public static int deleteFiles(final Path destination,

final Integer daysToKeep) throws IOException {

final Instant retentionFilePeriod = ZonedDateTime.now()

.minusDays(daysToKeep).toInstant();

final AtomicInteger countDeletedFiles = new AtomicInteger();

Files.find(destination, 1,

(path, basicFileAttrs) -> basicFileAttrs.lastModifiedTime()

.toInstant().isBefore(retentionFilePeriod))

.forEach(fileToDelete -> {

try {

if (!Files.isDirectory(fileToDelete)) {

Files.delete(fileToDelete);

countDeletedFiles.incrementAndGet();

}

} catch (IOException e) {

throw new UncheckedIOException(e);

}

});

return countDeletedFiles.get();

}

对于同时使用NIO文件流和JSR-310的JDK 8解决方案

long cut = LocalDateTime.now().minusWeeks(1).toEpochSecond(ZoneOffset.UTC);

Path path = Paths.get("/path/to/delete");

Files.list(path)

.filter(n -> {

try {

return Files.getLastModifiedTime(n)

.to(TimeUnit.SECONDS) < cut;

} catch (IOException ex) {

//handle exception

return false;

}

})

.forEach(n -> {

try {

Files.delete(n);

} catch (IOException ex) {

//handle exception

}

});

令人毛骨悚然的是需要处理每个lambda中的异常。对于每个IO方法来说,API具有UncheckedIOException重载将是很棒的。有了帮助者,可以这样写:

public static void main(String[] args) throws IOException {

long cut = LocalDateTime.now().minusWeeks(1).toEpochSecond(ZoneOffset.UTC);

Path path = Paths.get("/path/to/delete");

Files.list(path)

.filter(n -> Files2.getLastModifiedTimeUnchecked(n)

.to(TimeUnit.SECONDS) < cut)

.forEach(n -> {

System.out.println(n);

Files2.delete(n, (t, u)

-> System.err.format("Couldn't delete %s%n",

t, u.getMessage())

);

});

}

private static final class Files2 {

public static FileTime getLastModifiedTimeUnchecked(Path path,

LinkOption... options)

throws UncheckedIOException {

try {

return Files.getLastModifiedTime(path, options);

} catch (IOException ex) {

throw new UncheckedIOException(ex);

}

}

public static void delete(Path path, BiConsumer e) {

try {

Files.delete(path);

} catch (IOException ex) {

e.accept(path, ex);

}

}

}

Apache commons-io和joda的另一种方法:

private void deleteOldFiles(String dir, int daysToRemainFiles) {

Collection filesToDelete = FileUtils.listFiles(new File(dir),

new AgeFileFilter(DateTime.now().withTimeAtStartOfDay().minusDays(daysToRemainFiles).toDate()),

TrueFileFilter.TRUE);    // include sub dirs

for (File file : filesToDelete) {

boolean success = FileUtils.deleteQuietly(file);

if (!success) {

// log...

}

}

}

您可以使用NIO获取文件的创建日期,方法如下:

BasicFileAttributes attrs = Files.readAttributes(file, BasicFileAttributes.class);

System.out.println("creationTime:" + attrs.creationTime());

有关它的更多信息,请参见:http://docs.oracle.com/javase/tutorial/essential/io/fileAttr.html

BasicFileAttributes仅在Java 7中可用。不能在Java 6或更早版本中使用。

将Java NIO文件与lambdas和Commons IO一起使用

final long time = new Date().getTime();

// Only show files & directories older than 2 days

final long maxdiff = TimeUnit.DAYS.toMillis(2);

列出所有找到的文件和目录:

Files.newDirectoryStream(Paths.get("."), p -> (time - p.toFile().lastModified()) < maxdiff)

.forEach(System.out::println);

或使用FileUtils删除找到的文件:

Files.newDirectoryStream(Paths.get("."), p -> (time - p.toFile().lastModified()) < maxdiff)

.forEach(p -> FileUtils.deleteQuietly(p.toFile()));

这是删除六个月以来未修改的文件并创建日志文件的代码。

package deleteFiles;

import java.io.File;

import java.io.IOException;

import java.util.ArrayList;

import java.util.Calendar;

import java.util.Date;

import java.util.logging.FileHandler;

import java.util.logging.Logger;

import java.util.logging.SimpleFormatter;

public class Delete {

public static void deleteFiles()

{

int numOfMonths = -6;

String path="G:\\Files";

File file = new File(path);

FileHandler fh;

Calendar sixMonthAgo = Calendar.getInstance();

Calendar currentDate = Calendar.getInstance();

Logger logger = Logger.getLogger("MyLog");

sixMonthAgo.add(Calendar.MONTH, numOfMonths);

File[] files = file.listFiles();

ArrayList arrlist = new ArrayList();

try {

fh = new FileHandler("G:\\Files\\logFile\\MyLogForDeletedFile.log");

logger.addHandler(fh);

SimpleFormatter formatter = new SimpleFormatter();

fh.setFormatter(formatter);

for (File f:files)

{

if (f.isFile() && f.exists())

{

Date lastModDate = new Date(f.lastModified());

if(lastModDate.before(sixMonthAgo.getTime()))

{

arrlist.add(f.getName());

f.delete();

}

}

}

for(int i=0;i

logger.info("deleted files are ===>"+arrlist.get(i));

}

catch ( Exception e ){

e.printStackTrace();

logger.info("error is-->"+e);

}

}

public static void main(String[] args)

{

deleteFiles();

}

}

解释OP不能理解的部分,而不是为他们提供执行所需功能的大量代码,会更有帮助。在这里看一下已接受的答案,它的代码比您的要少得多,但是有更多的解释,它简洁地解决了问题。

需要指出列出的第一个解决方案的错误,如果x大,则x * 24 * 60 * 60 * 1000将最大化int值。因此需要将其转换为长期价值

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

if (diff > (long) x * 24 * 60 * 60 * 1000) {

file.delete();

}

使用Apache commons-io和joda:

if ( FileUtils.isFileOlder(f, DateTime.now().minusDays(30).toDate()) ) {

f.delete();

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值