在整个c盘中搜索文件类型

时间:2013-12-05 18:05:02

标签: java file io

好的,我的程序的一部分在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;
}

5 个答案:

答案 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
}