java - 如何递归列出目录中的所有 .rar 文件

标签 java android file

我想列出文件夹及其子文件夹中的 .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.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();

关于java - 如何递归列出目录中的所有 .rar 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41092104/

相关文章:

C# WPF - 打印目录中格式为 ".xml"的所有文件 - "could not find part of the path c#"

java - 逐行读取文件并将行添加到数组中

java - 在 Java 中验证字符串返回不正确。测试来自扫描仪的字符串长度?

android - android中 ListView 内的文本更改事件

javascript - 在 javascript 和 HTML 中从 ResourceBundle 中获取字符串

android - 如何定位 dppx 大于 2 但小于 3 的设备

java - Android - 在后台监听传入的 TCP/Socket 消息

windows - 在 Windows 中检测文件句柄冲突

Java - 如何验证这个字符串?

java - Android:响应式用户界面的最佳实践