我正在尝试删除目录中的每个文件(它的子目录,非常重要),这不是一个视频文件。这是我的ProcessDirectory类:
public class ProcessDirectory {
private File directory;
public static final String [] MOVIE_EXTENSIONS = {"avi", "mp4", "flv", "mkv"};
public ProcessDirectory(String path) {
this.directory = new File(path);
}
private Collection<File> findMovieFiles() throws IOException {
System.out.println("Getting all .avi, .mp4 files in " + this.directory.getCanonicalPath()
+ " including those in subdirectories");
Collection<File> videoFiles = FileUtils.listFiles(this.directory, MOVIE_EXTENSIONS, true);
return videoFiles;
}
public void removeAllNonMovieFiles() throws IOException {
Collection<File> movieFiles = findMovieFiles();
Collection<File> allFilesAndFolders = FileUtils.listFilesAndDirs(this.directory, TrueFileFilter.TRUE, TrueFileFilter.TRUE);
// have to use Iterator because otherwise it throws ConcurrentModificationException
Iterator<File> iter = allFilesAndFolders.iterator();
while (iter.hasNext()) {
File currentElement = iter.next();
if (!movieFiles.contains(currentElement)) {
iter.remove();
}
}
}
}
这就是我称之为方法的地方:
String path = "/run/media/michal/F04AA6E24AA6A536/Filmy/FilmyTest/";
ProcessDirectory directory = new ProcessDirectory(path);
try {
directory.removeAllNonMovieFiles();
} catch (IOException e) {
e.printStackTrace();
}
它似乎不起作用 - 没有文件被删除。我的两个集合都很好 - 使用System.out检查它们并且它们中包含正确的文件,但它们不会删除任何内容。
编辑:更改了我的代码,我认为它现在看起来更好但仍然不起作用。
答案 0 :(得分:2)
iter.remove()
只是从集合中删除该文件。您缺少实际删除文件的部分,例如Files.delete
或类似的内容。
你知道java.nio.file.Files
吗?有了它,您甚至可以编写如下代码:
Files.walk(Paths.get("your path here"))
.filter(isNotAMovieFile())
.forEach(delete());
这样您只需要实现Predicate<Path> isNotAMovieFile()
和Consumer<Path> delete()
,这应该非常简单。