好的,我的程序的一部分在C盘中搜索所有mp3文件,唯一的问题是它不会进入和子文件夹。到目前为止,这是我的代码。
public static List<String> ListFiles() {
List<String> files = new ArrayList<String>();
File folder = new File("C:/");
File[] listOfFiles = folder.listFiles();
for (File file : listOfFiles) {
if (file.isFile() && file.toString().contains(".mp3")) {
String fileS = file.getName();
files.add(fileS);
}
}
return files;
}
答案 0 :(得分:2)
尝试递归方法。该路径是您所在的当前目录。以递归方式在每个文件夹上调用此目录,您将进入每个文件。
public void walk(String path) {
File root = new File(path);
File[] list = root.listFiles();
if (list == null) return;
for (File f : list) {
if (f.isDirectory()) {
walk(f.getAbsolutePath());
}
else {
//do what you want with files
}
}
}
答案 1 :(得分:0)
测试file
是否为文件夹。如果是,请将其传递给ListFiles
并将返回值附加到files
。
要实现此目的,您需要更改ListFiles
以接受File
对象作为参数,并使用此File
开始搜索,而不是使用“C:/”
答案 2 :(得分:0)
查看DirectoryStream<Path>
类和Files.isDirectory()
方法。基本上你要做的是检查每个Path是一个文件还是目录。
如果是目录,则再次调用您的方法。否则,你继续迭代。
目录流也可以使用Globbing。节省了大量时间,而不必手动检查文件扩展名。
如果您希望继续使用您的方法或目录流,您需要对程序进行一些修改以适应递归。
答案 3 :(得分:0)
如果你想自己做,你需要让它递归。这是奥斯瓦尔德的目标。递归方法是一种调用自身的方法。因此,当您搜索文件夹时,对于其中的每个元素,如果是mp3,请将其添加到列表中,如果是文件夹,则再次调用您的方法将该文件夹作为输入传递。
答案 4 :(得分:0)
我知道这是Java问题,但为什么不使用Groovy并按照以下方式执行:
static List<String> listMp3s() {
List<String> files = []
File rootFolder = new File('C:/')
rootFolder.eachFileRecurse(FileType.FILES) {
if (it.name.endsWith('.mp3')) {
files << it.name
}
}
return files
}