@hax
junior developer

В чем ошибка работы алгоритма поиска?

Хотел реализовать алгоритм поиска файла, для нахождения всех совпадений:
Все совпадения будут выводиться в переменную find типа ArrayList. Ниже представлен сам алгоритм
spoiler
package com.filefind;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class Find {
    public static void main(String args[]) {
        long start = System.currentTimeMillis();
        try {

            ArrayList<File> find = new ArrayList<>(200);
            findFile("D:\\Autodesk", find, "README");
                find.forEach(System.out::println);
        }
        catch (NullPointerException error) {
            System.out.println("File not found!");
        }
        long end = System.currentTimeMillis();
        System.out.println("Поиск занял: " + (double) (end - start) / 1000 + " секунд");
    }

    public static void findFile(String path, List<File> result, String name) {
        if (!path.endsWith("\\"))
            path += "\\";
        File list[] = (new File(path)).listFiles();
        for (File file : list) {
            if (file.getName().contains(name))
                result.add(file);
            if (file.isDirectory())
                findFile(path + file.getName() + "\\", result, name);
        }
    }
}


На диске D:\ находится n файлов. Если вбивать конкретную папку на этом диске (т.е. D:\Folder1\), то поиск работает быстро и выдает верный результат. Если аргументу path передать значение D:\, то поиск выполняется 5-10 секунд и вылетает exception NullPointerException, однако при этом прогоняются все файлы и папки на диске D:\. Поиск через проводник Windows показал, что на диске хранятся 80 файлов, содержащих текст README. Почему после прогона в переменной find хранится null?

upd: Решил проблему. Код алгоритма поиска файлов:
spoiler
/** Функция поиска файлов в каталогах
     * @param path - путь, в котором следует выполнить поиск
     * @param result - в списке result будут храниться все совпадения
     * @param name - имя файла, которое следует найти
     */
    private static void findFile(String path, List<File> result, String name) {
        if (!path.endsWith("\\"))
            path += "\\";
        File list[] = (new File(path)).listFiles();
        if (list == null) return; // если listFiles() возвращает null, значит не удалось прочитать текущую папку (ограничение доступа в системе)
        for (File file : list) {
            if (file.getName().toLowerCase().contains(name.toLowerCase()))
                result.add(file);
            if (file.isDirectory())
                findFile(path + file.getName() + "\\", result, name);
        }
    }
  • Вопрос задан
  • 181 просмотр
Пригласить эксперта
Ответы на вопрос 2
Что в переменной list[] для D:\?

PS: Path separator в Java кроссплатформенный и вне зависимости от ОС следует использовать '/'
Также, чтобы не отслеживать эти слэши при склеивании имен файлов, лучше использовать конструктор File(File, String)
Ответ написан
@hax Автор вопроса
junior developer
Кажется, я нашёл причину ошибки. У меня на диске D:\ имеется одна скрытая папка, доступ к которой ограничивается системой. Именно поэтому при попытке чтения этой папки вылетает exception. Теперь вопрос в следующем: как программно мне отлавливать папки, доступ к которым ограничивается? Использовать try..catch или есть иной способ реализации?

upd: Решил проблему. Метод canExecute() почему-то не помог, однако заметил, что если метод listFiles() передаёт null, то чтение данной папки невозможно, поэтому просто выходим из метода.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
23 янв. 2022, в 13:48
80000 руб./за проект
23 янв. 2022, в 13:45
1500 руб./за проект