gpt4 book ai didi

Java - 递归查找所有扩展名修改日期介于两个日期之间的文件

转载 作者:行者123 更新时间:2023-11-30 06:40:40 24 4
gpt4 key购买 nike

我能够找到所有我想要的以递归扩展名结尾的文件,例如 .zip。

但我很乐意根据修改日期在两个日期之间进一步过滤。

我四处搜索并找到了只针对 .zip 或日期的方法。我已经能够做到这两点,但不能递归地向下目录和子目录

正如您在下面看到的,我创建了一个 FileFilterDateIntervalUtils(我稍后添加了它),我想对 .zip(或其他要配置的文件)和时间范围进行过滤接受。我想以某种方式将其添加到步行中,但我是新手。

public void finder(String dirName) {
System.out.println("Using directory: " + dirName);

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss a");
FileFilterDateIntervalUtils filter_date = new FileFilterDateIntervalUtils("2019-08-17 00:00:00 AM",
"2019-08-22 12:00:00 PM");

try (Stream<Path> paths = Files.walk(Paths.get(dirName))) {
paths.filter(Files::isRegularFile).forEach(System.out::println);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


public FileFilterDateIntervalUtils(String dateStart, String dateEnd) {
this.dateStart = dateStart;
this.dateEnd = dateEnd;
sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss a");
}

public boolean accept(File dir, String name) {
Date d = new Date(new File(dir, name).lastModified());
String current = sdf.format(d);
if(!name.endsWith(".zip")) {
return false;
}
return ((dateStart.compareTo(current) < 0 && (dateEnd.compareTo(current) >= 0)));
}

最佳答案

您可以使用 Java 中的内置机制来“遍历”文件树,称为 FileVisitor .它执行所有遍历和递归遍历 - 您只需要提供访问每个文件时要执行的操作的逻辑。

作为一个额外的好处,它在某种意义上具有隐式性能优化,即它不会将所有路径加载到内存中,而是一个接一个地“遍历”文件/目录,这对于内部包含许多文件/目录的目录很有用。

这是一个工作示例:

import java.io.File;
import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.FileVisitor;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.Path;
import java.nio.file.attribute.BasicFileAttributes;

public class Example {

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

// walks the file tree starting from current directory '.', using an
// instance of anonymous class that implements FileVisitor interface
Files.walkFileTree(Paths.get("."), new FileVisitor<Path>() {

@Override
public FileVisitResult visitFile(Path path,
BasicFileAttributes attrs) {

// some starting date
Date start = new Date();
// some ending date
Date end = new Date();

if (path.endsWith(".zip") &&
(attrs.creationTime().toMillis() >= start.getTime() &&
attrs.creationTime().toMillis() <= end.getTime())) {

// if you use Java 8 or later, you can work with Instant, like this
// attrs.creationTime().toInstant().isAfter(start.toInstant())

System.out.println(path);

// or optionally convert to File and do something with it
File file = path.toFile();
}

return FileVisitResult.CONTINUE;
}

@Override
public FileVisitResult visitFileFailed(Path file,
IOException exc) {
// unused
return FileVisitResult.CONTINUE;
}

@Override
public FileVisitResult postVisitDirectory(Path dir,
IOException exc) {
// unused
return FileVisitResult.CONTINUE;
}

@Override
public FileVisitResult preVisitDirectory(Path dir,
BasicFileAttributes attrs) {
// unused
return FileVisitResult.CONTINUE;
}
});
}

关于Java - 递归查找所有扩展名修改日期介于两个日期之间的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57599388/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com