Перебирайте все файлы в Java


Я хочу, чтобы моя программа напечатала огромный список всех файлов, которые у меня есть на компьютере. Моя проблема заключается в том, что он печатает только файлы из первой папки первого жесткого диска, когда я хочу, чтобы он печатал все файлы, расположенные на моем компьютере. Есть идеи, что я здесь делаю не так? Спасибо.

Вот код, который я использую:

Главная:

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

public class Main {

    public static void main(String[] args) {
        ArrayList<File> roots = new ArrayList();
        roots.addAll(Arrays.asList(File.listRoots()));


        for (File file : roots) {
            new Searcher(file.toString().replace('\', '/')).search();
        }
    }
}

И класс искателя:

import java.io.File;

public class Searcher {

    private String root;

    public Searcher(String root) {
        this.root = root;
    }

    public void search() {
        System.out.println(root);
        File folder = new File(root);
        File[] listOfFiles = folder.listFiles();
        for (File file : listOfFiles) {
            String path = file.getPath().replace('\', '/');
            System.out.println(path);
            if (!path.contains(".")) {
                new Searcher(path + "/").search();
            }
        }
    }
}
5 3

5 ответов:

Я только что попробовал это, и это сработало для меня. Мне пришлось добавить одну проверку null и изменить метод оценки каталога, хотя:

package test;

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

public class Searcher {
    public static void main(String[] args) {
        ArrayList<File> roots = new ArrayList<File>();
        roots.addAll(Arrays.asList(File.listRoots()));


        for (File file : roots) {
            new Searcher(file.toString().replace('\\', '/')).search();
        }
    }

    private String root;

    public Searcher(String root) {
        this.root = root;
    }

    public void search() {
        System.out.println(root);
        File folder = new File(root);
        File[] listOfFiles = folder.listFiles();
        if(listOfFiles == null) return;  // Added condition check
        for (File file : listOfFiles) {
            String path = file.getPath().replace('\\', '/');
            System.out.println(path);
            if (file.isDirectory()) {
                new Searcher(path + "/").search();
            }
        }
    }
}

Вы должны обновить свой метод поиска следующим образом:

public void search() {
        System.out.println(root);
        File folder = new File(root);
        File[] listOfFiles = folder.listFiles();
        for (File file : listOfFiles) {
            String path = file.getPath().replace('\\', '/');
            System.out.println(path);
            if (file.isDirectory()) {
                new Searcher(path + "/").search();
            }
        }
    }

Если Java 7 является опцией, загляните в методwalkFileTree () . Это позволит вам посетить все файлы и каталоги в дереве, которое вы можете начать с корня вашего диска. Просто реализуйте базовый FileVisitor для обработки атрибутов файла для каждого Path. Вы можете начать работу здесь .

Я не знаю, какую ошибку вы получаете, но я получил NPE, потому что вы не проверяете значение null после следующей строки.

File[] listOfFiles = folder.listFiles();

После изменения кода следующим образом он , казалось, работал нормально, я остановил его, потому что у меня много файлов. Я предполагаю, что он перейдет к следующему корню после первого корня (c:/ в моем случае)

import java.io.File;

Импорт java.утиль.список ArrayList; импорт java.утиль.Массивы;

Публичный поиск классов {

    public static void main(String[] args) {
        ArrayList<File> roots = new ArrayList();
        roots.addAll(Arrays.asList(File.listRoots()));


        for (File file : roots) {
            System.out.println(file.toString());
            new Searcher(file.toString().replace('\\', '/')).search();
        }
    }
}

Искатель Классов {

private String root;

public Searcher(String root) {
    this.root = root;
}

public void search() {
    System.out.println(root);
    File folder = new File(root);
    File[] listOfFiles = folder.listFiles();
    if(listOfFiles!=null)
    {
    for (File file : listOfFiles) {
        String path = file.getPath().replace('\\', '/');
        System.out.println(path);
        if (!path.contains(".")) {
            new Searcher(path + "/").search();
        }
    }
    }
}

}