2017-01-19 73 views
2

我想刪除一個目錄中的所有文件(和它的子目錄中,很重要的),這是不是一個視頻file.Here是我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

在'videoFiles.removeIf'之前和之後添加一些日誌(或System.out)來查看此Collection的大小。你會看到'videoFiles'是否設置正確。 –

+0

我改變了我的代碼,如果你仍然有興趣幫助我:) – doublemc

+0

但現在,你不再有'file.delete()',這是存在於你以前的代碼。如果在'iter.remove();'之前添加'currentElement.delete();'會發生什麼?在調試模式下,您是否嘗試查看是否輸入了「if」語句? –

回答

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()這應該是非常直接的。

+0

我認爲集合就像圖像1:1的實際文件,但它實際上就像這些對象的分析名稱?例如,如果我想重命名一些文件,我不能只是做Collection.rename,但必須使用Files.rename或其他一些實際與文件交互的函數來訪問它們。 – doublemc

+0

該集合包含代表實際文件的「File」對象。該集合只是一個通用容器,可以包含任何對象。因此,除了從該集合中刪除對象之外,集合無法知道它應該對刪除執行什麼操作。 – Roland

相關問題