我正在尝试删除Java中的特定文件夹,而我正在使用Apache Commons类来完成这项工作。如果有更好的选择,请告诉我。
import org.apache.commons.io.FileUtils;
FileUtils.deleteDirectory(new File(destination));
现在我需要做的是 - 我需要找到这个文件夹/opt/hello/world
中的所有目录,这些目录是X天(这里X可以是30天)并逐个删除所有这些目录。这些目录也可以包含文件,因此一旦删除目录,文件也将被删除。我正在研究API,我看到了AgeFilter类,所以我开始使用这样的:
import java.io.File;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.AgeFileFilter;
private static final int DAYS_OLD = 30;
public void deleteFiles(File file) {
long purgeTime = System.currentTimeMillis() - (DAYS_OLD * 24L * 60L * 60L * 1000L);
Iterator<File> filesToDelete = FileUtils.iterateFiles(file, new AgeFileFilter(purgeTime), TRUE);
for (File aFile : filesToDelete) {
aFile.delete();
}
}
但我在for循环中遇到此错误。我做错了什么?
Can only iterate over an array or an instance of java.lang.Iterable
更新: -
long purgeTime = System.currentTimeMillis() - (DAYS_OLD * 24L * 60L * 60L * 1000L);
AgeFileFilter filter = new AgeFileFilter(purgeTime);
File path = new File("/opt/hello/world");
File[] oldFolders = FileFilterUtils.filter(filter, path);
for (File folder : oldFolders) {
FileUtils.deleteDirectory(folder);
}
答案 0 :(得分:1)
您可以改用ListIterator
,这将返回与您的过滤器匹配的FileFilterUtils.filter(IOFileFilter, File...)
数组。
我还推荐使用基本的时间算法,例如Java 8有一个新的Time API,你可以一次使用Joda-Time甚至File
,他们会解决了日期/时间计算周围的一些异常情况
作为一个例子......
Calendar
但你会使用(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(
FileFilterUtils.directoryFileFilter(),
FileFilterUtils.filter(
filter,
path.listFiles()));
for (File folder : oldFolders) {
System.out.println(folder);
}
或数组)归结为你需要的东西
答案 1 :(得分:0)
您遇到this guy
的同样问题要在迭代时安全地从集合中删除,您应该这样做 使用迭代器。
**并在删除前调用下一个项目
马克以完整的方式回答。 Take a look here
List<File> files= .... Iterator<File> i = files.iterator(); while (i.hasNext()) { File s = i.next(); // must be called before you can call i.remove() // Do something i.remove(); }