我正在尝试使用以下代码从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天前) - &gt; test folder last modified(2天前) - &gt; file1.jpg(最后修改3天前),file2.txt(最后修改4天前)。
有人可以帮助我吗?
谢谢!
答案 0 :(得分:1)
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();
}
答案 1 :(得分:1)
Java NIO2(路径,文件,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: %s\n", 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: %s\n", 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
- &gt;上次修改时间
-t
- &gt;时间
如果您想要更少的代码,请使用extends SimpleFileVisitor
代替implements FileVisitor
并仅实现必要的方法(省略所有空方法)
如果您在1.10之前使用Java,请将var
替换为实例类型。
重要强> 小心这段代码。如果父文件夹(在本例中为:testFolder)在最后一段时间内没有被修改,它也将被删除。
要避免这种情况,您可以修改主要方法:
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: %s\n", dir.toAbsolutePath().toString());
Files.walkFileTree(dir, fileVisitorDeleteFolder);
}
} catch (IOException e) {
e.printStackTrace();
}
}