Перебирайте все файлы в 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 ответов:
Я только что попробовал это, и это сработало для меня. Мне пришлось добавить одну проверку
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
. Вы можете начать работу здесь .
Если вы используете Java SE 7, используйте новый файл API:
Http://docs.oracle.com/javase/7/docs/api/java/nio/file/FileVisitor.html
Я не знаю, какую ошибку вы получаете, но я получил 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(); } } } }
}