самый быстрый способ найти список файлов в огромном дереве каталогов Windows - PullRequest
2 голосов
/ 12 мая 2019

У меня есть дерево каталогов Windows с около 1 000 000 файлов внутри. У меня есть текстовый файл, который я читаю на Java, содержит некоторые имена файлов (около 100 000), и я хочу проверить каждое имя файла - существует ли оно в каталоге (если да - укажите полный путь к файлу).

Уже пробовали эти варианты:

1

File folder = new File("your/path");
File[] listOfFiles = folder.listFiles();

for (int i = 0; i < listOfFiles.length; i++) {
  if (listOfFiles[i].isFile()) {
    System.out.println("File " + listOfFiles[i].getName());
  } else if (listOfFiles[i].isDirectory()) {
    System.out.println("Directory " + listOfFiles[i].getName());
  }
}

2.

public void func(String path, String name)
{

    Path folder = Paths.get(path);
    try (DirectoryStream<Path> stream = Files.newDirectoryStream(folder))
    {
        for (Path entry : stream) 
        {
            if(Files.isDirectory(entry))
            {
                func(entry.toString(), name);
            }
            else
            {
                if(FilenameUtils.removeExtension(entry.getFileName().toString()).equals(name))
                {
                    System.out.println(entry);
                }
            }
        }
    } 
    catch (IOException ex) {
    // An I/O problem has occurred
    }

}

Пока что все эти варианты очень медленные. Как я полагаю, хотя все файлы находятся в одном и том же логическом месте, фактически каждый файл сохраняется в другом месте на жестком диске, поэтому все эти вызовы ввода-вывода занимают слишком много времени.

Другая идея, которую я нашел здесь, - это интерфейс ISearchFolderItemFactory, но я нашел документацию для него только на C ++, а не на Java.

Может быть, я смогу реализовать предварительную сортировку или что-то, чтобы все файлы действительно были объединены в hd, отсортированные по имени, а затем использовать какой-нибудь хеш-метод для поиска имени по имени?

Нужна помощь ...

...