使用 FileUtils 时只能遍历数组或 java.lang.Iterable 的实例
Can only iterate over an array or an instance of java.lang.Iterable while using FileUtils
我正在尝试删除 Java 中的特定文件夹,我正在使用 Apache Commons class 来完成这项工作。如果有更好的选择也请告诉我。
import org.apache.commons.io.FileUtils;
FileUtils.deleteDirectory(new File(destination));
现在我需要做的是 - 我需要找到这个文件夹 /opt/hello/world
中的所有目录,该文件夹存在 X 天(这里 X 可以是 30 天),然后一一删除所有这些目录。这些目录也可以包含文件,所以一旦我删除目录,文件也将被删除。我正在查看 API 并看到 AgeFilter class 所以我开始这样使用:
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);
}
您可以改用 FileFilterUtils.filter(IOFileFilter, File...)
,这将 return 一组 File
匹配您的过滤器。
我还建议使用除基本时间算术之外的任何其他方法,例如 Java 8 有一个新时间 API,您可以使用 Joda-Time 甚至 Calendar
一口气,他们将解释围绕 date/time 计算
的一些异常情况
举个例子...
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);
}
但是您将使用哪种(Iterable
或数组)取决于您的需要
您面临与 this guy
相同的问题
To safely remove from a collection while iterating over it you should
use an Iterator.
**And call the next item before delete
马克回答完整。 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();
}
我正在尝试删除 Java 中的特定文件夹,我正在使用 Apache Commons class 来完成这项工作。如果有更好的选择也请告诉我。
import org.apache.commons.io.FileUtils;
FileUtils.deleteDirectory(new File(destination));
现在我需要做的是 - 我需要找到这个文件夹 /opt/hello/world
中的所有目录,该文件夹存在 X 天(这里 X 可以是 30 天),然后一一删除所有这些目录。这些目录也可以包含文件,所以一旦我删除目录,文件也将被删除。我正在查看 API 并看到 AgeFilter class 所以我开始这样使用:
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);
}
您可以改用 FileFilterUtils.filter(IOFileFilter, File...)
,这将 return 一组 File
匹配您的过滤器。
我还建议使用除基本时间算术之外的任何其他方法,例如 Java 8 有一个新时间 API,您可以使用 Joda-Time 甚至 Calendar
一口气,他们将解释围绕 date/time 计算
举个例子...
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);
}
但是您将使用哪种(Iterable
或数组)取决于您的需要
您面临与 this guy
相同的问题To safely remove from a collection while iterating over it you should use an Iterator.
**And call the next item before delete
马克回答完整。 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(); }