listFiles()但忽略Android中的子目录

时间:2018-01-02 19:20:50

标签: android file

我需要获取文件列表但忽略特定的子目录。例如,这是一个示例结构。

Content
->1
-->file_a.mp4
-->file_b.mp4
->2
-->file_c.mp4
-->file_d.mp4
->Bonus
-->1
--->file_e.mp4
--->file_f.mp4

我需要能够获得排除奖励目录的文件/目录列表。

我还需要单独列出奖励目录的文件列表,但我认为可以通过常规方法轻松解决。

如何执行列表文件,但忽略目录?

以下是我将返回所有内容的示例代码

final List<Boxset> boxsets = getCloudBoxsetsWithTrackData(context);
        final File[] boxsetFiles = dir.listFiles();
        if (boxsetFiles != null)
        {
            for (File subDir : boxsetFiles)
            {
                if (subDir.isDirectory())
                {
                    for (Boxset boxset : boxsets)
                    {
                        if (subDir.getName().equalsIgnoreCase(String.valueOf(boxset.persistentId)))
                        {
                            DBHandler.getInstance(context).moveBoxsetToDeviceList(boxset);
                            DownloadLibrarian.getInstance(context).stopDownload(boxset);
                        }
                    }
                }
            }
        }

1 个答案:

答案 0 :(得分:0)

您可以使用FileFilter获取不包含Bonus的子目录列表

File[] nonBonusDirs = dir.listFiles(new FileFilter() {
  @Override public boolean accept(File file) {
    return file.isDirectory() && !file.getName().equalsIgnoreCase("bonus");
  }
});

然后,您可以获取不在Bonus目录中的所有文件的列表

List<File> filesNotInBonusDir = new ArrayList<>();

for (File directory : nonBonusDirs) {
  filesNotInBonusDir.addAll(Arrays.asList(directory.listFiles()));
}

当然,由于flatMap,这些恶作剧在Kotlin中要好得多;)

val filesNotInBonusDir: List<File> = dir.listFiles()
    .filter { it.isDirectory && !it.name.equals("bonus", ignoreCase = true) }
    .flatMap { it.listFiles().toList() }