在 java 中删除超过一天的文件夹



我正在尝试使用以下代码从java中的路径中删除所有较早的文件夹:

public static void removeDirectory(File dir) {
long purgeTime = System.currentTimeMillis() - (1 * 24 * 60 * 60 * 1000);
if (dir.isDirectory()) {
File[] files = dir.listFiles();
for (File aFile : files) {
if (aFile.lastModified() < purgeTime) {
removeDirectory(aFile);
}
}
dir.delete();
} else {
dir.delete();
}
}
public static void createBackupFS(java.awt.event.ActionEvent evt) {
File directory = new File(pathsavefsbackup.getText());
removeDirectory(directory);
}

唯一发生的事情是旧文件使用当前时间进行修改。 提到根文件夹中有一个文件夹,里面有文件。

路径结构:

根文件夹 - 上次修改时间(2 天前(> 测试文件夹上次修改时间(2 天前(-> file1.jpg(上次修改时间 3 天前(、file2.txt(上次修改时间:4 天前(。

有人可以帮助我吗?

谢谢!

for 循环遍历给定文件夹中的每个文件

for (File aFile : files)

因此,您所要做的就是检查当前文件是否早于 24 小时,如果它被删除,否则不会。 您不需要使代码过于复杂,这里是代码的修改版本。

下面的代码删除给定目录中早于 1 天的任何文件夹/文件

public static void removeDirectory(File dir) {
boolean delSource = false;
long purgeTime = System.currentTimeMillis() - (10 * 1000);
if (dir.lastModified()< purgeTime) delSource = true;
if (dir.isDirectory()) {
File[] files = dir.listFiles();
for (File aFile : files) {
if (aFile.lastModified() < purgeTime) {
aFile.delete();
}
}
}
if(delSource) dir.delete();
}
public static void createBackupFS() {
File directory = new File("F:\document\eclipse\JavaAZ\src\Delete");
removeDirectory(directory);
}

PS:如果文件中有文件等等,则必须为此使用递归

所有文件和文件夹的递归解决方案

public static void removeDirectory(File dir) {
long purgeTime = System.currentTimeMillis() - (1 * 24 * 60 * 60 * 1000);
if(dir.isDirectory() == false && dir.lastModified() < purgeTime) dir.delete();
else if (dir.isDirectory() == true && dir.lastModified() < purgeTime) recursiveDelete(dir);
else if(dir.isDirectory()){
File[] files = dir.listFiles();
for (File aFile : files)
removeDirectory(aFile);
}
}
public static void createBackupFS() {
File directory = new File("F:\downloads\Compressed\backup");
removeDirectory(directory);
}
public static void recursiveDelete(File file) {
if (!file.exists())
return;
if (file.isDirectory()) {
for (File f : file.listFiles()) {
recursiveDelete(f);
}
}
file.delete();
}

Java NIO2 (Path, Files, FileVisitor(

我正在使用 2 个实现FileVisitor接口的类。 第一个检测在 X 时间段之前修改过的所有文件夹/子文件夹。 第二个删除第一类存储的所有文件夹

Files.walkFileTree(Path, FileVisitor<Class>)用于遍历目录。 所有类合二为一(您可以将FileVisitorFolders提取并FileVisitorDeleteFolders到类文件

import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
import java.time.Instant;
import java.time.Period;
import java.util.ArrayList;
public class Main {

private static class FileVisitorFolders implements FileVisitor<Path> {
private Instant beforePeriodOfTime;
private ArrayList<Path> directories = new ArrayList<>(10);
public FileVisitorFolders(Period time) {
beforePeriodOfTime = Instant.now().minus(time);
}
public ArrayList<Path> getDirectories() {
return directories;
}
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
var lastModifiedTime = Files.getLastModifiedTime(dir, LinkOption.NOFOLLOW_LINKS);
if (lastModifiedTime.toInstant().isBefore(beforePeriodOfTime)) {
directories.add(dir);
}
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
return FileVisitResult.CONTINUE;
}
}
private static class FileVisitorDeleteFolders implements FileVisitor<Path> {

@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
Files.delete(file);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
Files.delete(dir);
return FileVisitResult.CONTINUE;
}
}
public static void main(String[] args) {
var fileVisitorFolders = new FileVisitorFolders(Period.ofDays(1));
var fileVisitorDeleteFolder = new FileVisitorDeleteFolders();
try {
Files.walkFileTree(Paths.get("testFolder"), fileVisitorFolders);
for (Path dir : fileVisitorFolders.getDirectories()) {
System.out.printf("Deleting: %sn", dir.toAbsolutePath().toString());
Files.walkFileTree(dir, fileVisitorDeleteFolder);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

它是如何工作的?

这里有下一个目录:(注意:今天是2018-06-18(

tree -D testFolder/
testFolder/
├── [Jun 17  5:00]  a
├── [Jun 18 18:06]  b
├── [Jun 15  5:00]  c
│   ├── [Jun 18 18:06]  e
│   └── [Jun 18 18:06]  hi
└── [Jun 18 17:30]  e
5 directories, 1 file

文件夹a已在 1 天前修改,文件夹c已在 3 天前修改。 文件夹a为空,文件夹c具有子文件夹e和文件hi

主要方法是:

public static void main(String[] args) {
var fileVisitorFolders = new FileVisitorFolders(Period.ofDays(1));
var fileVisitorDeleteFolder = new FileVisitorDeleteFolders();
try {
Files.walkFileTree(Paths.get("testFolder"), fileVisitorFolders);
for (Path dir : fileVisitorFolders.getDirectories()) {
System.out.printf("Deleting: %sn", dir.toAbsolutePath().toString());
Files.walkFileTree(dir, fileVisitorDeleteFolder);
}
} catch (IOException e) {
e.printStackTrace();
}
}
  1. 递归检查testFolder的所有子文件夹,并保存在此时间段之前修改的每个文件夹的路径:Period.ofDays(1)
  2. 删除(递
  3. 归(以前保存的所有文件夹(路径(

输出:

Deleting: /root/IdeaProjects/DeleteFolder/testFolder/a
Deleting: /root/IdeaProjects/DeleteFolder/testFolder/c
Process finished with exit code 0

现在我们有:

tree -D testFolder/
testFolder/
├── [Jun 18 18:06]  b
└── [Jun 18 17:30]  e
2 directories, 0 files

注意:在使用之前,请测试它注释行://Files.walkFileTree(dir, fileVisitorDeleteFolder);要更改上次修改文件/文件夹的日期(在 Linux 上(,您可以使用以下命令touch如下:

touch -m -t 201806150700 folderName/fileName

-m->上次修改时间

-t->时间

如果需要较少的代码,请使用extends SimpleFileVisitor代替implements FileVisitor,并且仅实现必要的方法(省略所有空方法(

如果您在 1.10 之前使用 Java,请将var替换为实例类型。


重要提示请小心使用此代码。如果父文件夹(在本例中为testFolder(在最近一段时间内未被修改,它也将被删除。

要避免这种情况,您可以修改 main 方法:

public static void main(String[] args) {
var parent = Paths.get("testFolder");
var fileVisitorFolders = new FileVisitorFolders(Period.ofDays(1));
var fileVisitorDeleteFolder = new FileVisitorDeleteFolders();
try {
Files.walkFileTree(parent, fileVisitorFolders);
var foldersToDelete = fileVisitorFolder.getDirectories();
foldersToDelete.remove(parent);
for (Path dir : foldersToDelete) {
System.out.printf("Deleting: %sn", dir.toAbsolutePath().toString());
Files.walkFileTree(dir, fileVisitorDeleteFolder);
}
} catch (IOException e) {
e.printStackTrace();
}
}

相关内容

最新更新