我想列出文件夹及其子文件夹中的 .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
文件,它只列出了直接文件夹中的文件。
例如说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();
关于java - 如何递归列出目录中的所有 .rar 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41092104/