[英]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.rar
和door.rar
,沒有列出Bedroom
和Kitchen
文件夾中的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.