Как фильтровать папки (каталоги и подкаталог) на основе указанного расширения файла c в java ..? - PullRequest
1 голос
/ 12 июля 2020

Хорошо, я много прочитал, и мне не удалось понять, как фильтровать папки (каталоги и подкаталог) на основе расширения файла, например, мне нужен список папок (каталоги и подкаталог), который содержит только Файлы ".mp3" или ".mp4", и я не хочу использовать Walk.Tree, если есть какой-либо способ через "filenameFilter" или любой другой способ, кроме метода Walk.tree.

это код, который я пробовал до сих пор, без ошибок, но также без фильтрации определенных папок файлов c. он показывает все папки.

Спасибо заранее.

  File[] ff = f.listFiles(new FilenameFilter() {
                @Override
                public boolean accept(File dir, String name) {
                    return name.toLowerCase().endsWith(".mp3") || new File(dir.toPath().toString(),name).isDirectory();
                }

            });

1 Ответ

1 голос
/ 12 июля 2020

Вот простое консольное приложение.

Алгоритм выглядит следующим образом:

  1. Сначала выполните рекурсивный поиск в указанной папке root всех файлов с расширением mp3 и продолжайте их добавлять в список.
  2. Если этот список окажется пустым, вернитесь.
  3. В противном случае для каждого из этих файлов mp3 рекурсивно найдите их родительские папки, пока не дойдете до папки root, и продолжайте сохранять эти родительские папки в наборе, чтобы избежать дублирования поиска.
  4. Теперь распечатайте все эти допустимые папки, начиная с root.
public class MyApp {

  public static void main(String[] args) {

    File rootDir = new File("src/main/resources/dir1");
    List<File> filesListWithValidExtension = new ArrayList<>();
    recursiveSearch(rootDir, filesListWithValidExtension);

    if (filesListWithValidExtension.size() == 0) {
      System.out.println("Specified root directory has no file with mp3 extension");
      return;
    }

    Set<File> requiredFolders = new HashSet<>();
    for (File fileWithValidExtension : filesListWithValidExtension) {
      File parent;
      do {
        parent = fileWithValidExtension.getParentFile();
        if (requiredFolders.contains(parent)) {
          break;
        } else {
          requiredFolders.add(parent);
          fileWithValidExtension = parent;
        }
      }
      while (!parent.getPath().equals(rootDir.getPath()));
    }

    System.out.println("Printing folders (from root) containing mp3 files");
    recursivePrint(rootDir, requiredFolders);

  }

  private static void recursiveSearch(File file, List<File> filesListWithvalidExtension) {
    if (!file.exists()) {
      return;
    }
    if (file.isDirectory()) {
      for (File f : file.listFiles()) {
        recursiveSearch(f, filesListWithvalidExtension);
      }
    }
    if (file.getName().toLowerCase().endsWith(".mp3")) {
      filesListWithvalidExtension.add(file);
    }
  }

  private static void recursivePrint(File file, Set<File> requiredFolders) {
    if (!requiredFolders.contains(file)) {
      return;
    }
    System.out.println(file.getPath());

    for (File f : file.listFiles()) {
      recursivePrint(f, requiredFolders);
    }

  }

}

Эта программа выводит как:

Printing folders (from root) containing mp3 files
src/main/resources/dir1
src/main/resources/dir1/dir12
src/main/resources/dir1/dir11
src/main/resources/dir1/dir11/dir111
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...