簡體   English   中英

如何以遞歸方式列出目錄中的所有.rar文件

[英]How to recursively list all .rar files in a directory

我想在一個文件夾中列出.rar文件,並將其放在子文件夾中,直到沒有文件夾為止。

這是我當前正在使用的代碼:

private String getFileNums(File file) {
        if (file.isDirectory()) {
            File[] list = file.listFiles(new FilenameFilter() {
                @Override
                public boolean accept(File file, String s) {
                    return s.toLowerCase().endsWith(".rar");
                }
            });
            int count = 0;
            if (list != null) {
                for (File f : list) {
                    if (f.isDirectory()) {
                        getFileNums(f);
                    } else {
                        count++;
                    }
                }
            }
            return  "Number of rar files in this folder and subfolders is " + count;
        } else {
            long length = file.length();
            return "File size in bytes is " + length;);
        }
    }

我在這段代碼中.rar的問題是,它沒有在子文件夾中列出.rar文件,而僅在直接文件夾中列出了這些文件。

例如,說“ House是一個文件夾,其中包含Bedroom (文件夾), Kitchen (文件夾), chair.rar (rar文件)和door.rar (rar文件)。 上面的代碼只列出了chair.rardoor.rar ,沒有列出BedroomKitchen文件夾中的rar文件。

請問有什么地方可以解決嗎?

問題出在您的FilenameFilter 它也過濾掉名稱也不以“ .rar”結尾的目錄,而大多數目錄都沒有。 您需要確保它們通過了過濾器。

 new FilenameFilter() {
     @Override
     public boolean accept(File dir, String filename) {
         // create a file object to check whether we are looking at a directory.
         File f = new File(dir, filename); 
         return f.isDirectory() || filename.toLowerCase().endsWith(".rar");
     }
 }

閱讀您的評論后,我意識到您的代碼無法“連接”遞歸。

int count = 0;

if (f.isDirectory()) {
    // Nothing comes out of the recursive call.
    // The result is completely lost
    getFileNums(f);
}

另外,對於要遞歸計算RAR文件數量的方法,您想返回int而不是String

private int getFileNums(File file) {
    if (file.isDirectory()) {
        File [] files = file.listFiles();
        if (files != null) {
            int count = 0;
            for (File f : files) {
                 if (f.isDirectory()) {
                     count += getFileNums(f);
                 } else if (f.getName().toLowerCase().endswith(".rar")) {
                     count++;
                 }
            }
            return count;
        } else {
            return 0;
        }
    } else {
        throw new IllegalArgumentException("Expecting a directory.");
    }
}

如果您使用的是Java 8

您可以使用Files.walk

import java.nio.file.*;

long numOfRar = Files.walk(file.toPath(), FileVisitOption.FOLLOW_LINKS)
                     .filter(p->p.toString().toLowerCase().endsWith(".rar"))
                     .count();

有時,更容易看到偽代碼中的內容。 無論如何,我認為是的。

processDirectory(thisDir)
  for each entry in thisDir
    if (entry is directory)
      processDirectory(entry)  // Recurse.
    else if (entry is .rar file)
      processRarFile(entry)
    endif
  endfor
end

正如Luke指出的那樣,您的代碼與該模式不匹配。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM