我正在尝试使用以下代码从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();
}
}
- 递归检查
testFolder
的所有子文件夹,并保存在此时间段之前修改的每个文件夹的路径:Period.ofDays(1)
删除(递 - 归(以前保存的所有文件夹(路径(
输出:
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();
}
}