删除所有文件,但视频扩展名为

时间:2017-01-19 08:06:18

标签: java

我正在尝试删除目录中的每个文件(它的子目录,非常重要),这不是一个视频文件。这是我的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检查它们并且它们中包含正确的文件,但它们不会删除任何内容。

编辑:更改了我的代码,我认为它现在看起来更好但仍然不起作用。

1 个答案:

答案 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(),这应该非常简单。