我正在编写一个递归程序,它将路径作为输入。然后,无论文件和文件夹在哪个深度,它都会详尽地搜索其下的所有文件和文件夹。
我已经编写了一个java程序,如下所示:
void RecursiveFileSearch(File f, String d) {
int i;
String s[] = f.list();
for (i = 0; i < s.length; i++) {
File fs = new File(d + "/" + s[i]);
if (fs.isDirectory()) {
System.out.println("#DIRECTORY :"+s[i]);
d += "/" + s[i];
RecursiveFileSearch(fs, d);
} else {
System.out.println("@FILE : "+s[i]);
}
}
}
此功能从外部调用,如:
String sourceDirectoryPath = "D:";
File sourceFile = new File(sourceDirectoryPath);
RecursiveFileSearch(sourceFile,sourceDirectoryPath);
但问题是只搜索源目录下的文件和文件夹。它没有进一步深入。
我错过了什么吗?
答案 0 :(得分:2)
为什么不使用JDK为您提供的API?
使用Java 8,它很简单:
try (
final Stream<Path> stream = Files.walk(baseDir);
) {
stream.forEach(path -> System.out.printf("%s: %s\n",
(Files.isDirectory(path) ? "DIRECTORY": "FILE"), path));
}
答案 1 :(得分:1)
问题是String
变量d
在每次递归调用方法时都会发生变化,每次都会将目录名附加到上一个目录。您可以通过定义新的String
变量来解决此问题,而不是重复使用相同的变量:
void RecursiveFileSearch(File f, String d) {
int i;
String s[] = f.list();
for (i = 0; i < s.length; i++) {
File fs = new File(d + "/" + s[i]);
if (fs.isDirectory()) {
System.out.println("#DIRECTORY :"+s[i]);
String d2 = d + "/" + s[i];
RecursiveFileSearch(fs, d2);
} else {
System.out.println("@FILE : "+s[i]);
}
}
}
答案 2 :(得分:1)
我不知道你为什么要使用Strings来解决这个问题。使用“getAbsoluteFile”将Path作为字符串格式化,然后将其打印到控制台,并仅在编程逻辑中的文件对象上工作。这将使您的代码更加清晰。
void RecursiveFileSearch(File f) {
File[] list = f.listFiles();
for (File elem : list) {
if (elem.isDirectory()) {
System.out.println("#DIRECTORY:"+elem.getAbsoluteFile());
RecursiveFileSearch(x);
} else {
System.out.println("@FILE : "+elem.getAbsoluteFile());
}
}
}
编辑:删除现在无用的声明,如果我。
答案 3 :(得分:0)
这应该有效:
void RecursiveFileSearch(File f, String d) {
int i;
String s[] = f.list();
for (i = 0; i < s.length; i++) {
File fs = new File(d + "/" + s[i]);
if (fs.isDirectory()) {
System.out.println("#DIRECTORY :"+s[i]);
RecursiveFileSearch(fs, d + "/" + s[i]);
} else {
System.out.println("@FILE : "+s[i]);
}
}
}