在使用FileUtils时,只能遍历数组或java.lang.Iterable的实例

时间:2015-09-09 01:44:31

标签: java file time apache-commons delete-file

我正在尝试删除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);
}

2 个答案:

答案 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();
}