Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的listFiles()无法获取所有文件_Java_List_File_Recursion - Fatal编程技术网

Java中的listFiles()无法获取所有文件

Java中的listFiles()无法获取所有文件,java,list,file,recursion,Java,List,File,Recursion,我编写了这个函数,它看起来还可以,但是如果当前目录中有多个文件夹,并且没有文件,它就会失败。它只进入第一个文件夹并在那里执行作业,而忽略其他文件夹。如何修复此错误 public static void getAllFiles(File folder, List<File> result) { File[] listOfFiles = folder.listFiles(); for (int i = 0; i < listOfFiles.length; i++)

我编写了这个函数,它看起来还可以,但是如果当前目录中有多个文件夹,并且没有文件,它就会失败。它只进入第一个文件夹并在那里执行作业,而忽略其他文件夹。如何修复此错误

public static void getAllFiles(File folder, List<File> result) {
    File[] listOfFiles = folder.listFiles();
    for (int i = 0; i < listOfFiles.length; i++) {
        if (listOfFiles[i].isFile()) {
           result.add(listOfFiles[i]);
        }
        if (listOfFiles[i].isDirectory()) {
            getAllFiles(listOfFiles[i], result);
        }
    }
}
publicstaticvoidgetallfiles(文件夹,列表结果){
File[]listOfFiles=folder.listFiles();
for(int i=0;i
我试了一下:

public void listf(字符串目录名,列表文件){
文件目录=新文件(目录名)
//从目录中获取所有文件
File[]fList=directory.listFiles();
for(文件:fList){
if(file.isFile()){
文件。添加(文件);
}else if(file.isDirectory()){
listf(file.getAbsolutePath(),files);
}
}
}

我对您的代码没有问题,但您可能会遇到“符号链接”(如Windows上的“我的文档”)的问题,虽然它们看起来像目录,但Java无法解析它们,调用
listXxx
将返回
null

话虽如此,你也可以尝试使用类似

public static void getAllFiles(File folder, List<File> result) {
    System.out.println(folder.getName());
    File[] listOfFiles = folder.listFiles(new FileFilter() {
        @Override
        public boolean accept(File pathname) {
            return pathname.isFile();
        }
    });
    if (listOfFiles != null && listOfFiles.length > 0) {
        result.addAll(Arrays.asList(listOfFiles));
    }
    File[] listOfFolders = folder.listFiles(new FileFilter() {
        @Override
        public boolean accept(File pathname) {
            return pathname.isDirectory();
        }
    });
    for (File subFolder : listOfFolders) {
        getAllFiles(subFolder, result);
    }
}
publicstaticvoidgetallfiles(文件夹,列表结果){
System.out.println(folder.getName());
File[]listOfFiles=folder.listFiles(新文件过滤器(){
@凌驾
公共布尔接受(文件路径名){
返回路径名.isFile();
}
});
if(listOfFiles!=null&&listOfFiles.length>0){
addAll(Arrays.asList(listOfFiles));
}
File[]listOfFolders=文件夹.listFiles(新文件过滤器(){
@凌驾
公共布尔接受(文件路径名){
返回路径名.isDirectory();
}
});
用于(文件子文件夹:listOfFolders){
getAllFiles(子文件夹、结果);
}
}
而是列出文件和目录


我相信新的nio2(
文件
路径
API)已经解决了这个问题。

也许您应该尝试NIO中的walkFileTree方法。2:

public List<Path> findAllFilesInDirectory(Path pathToDir) throws IOException {
    final List<Path> pathsToFiles = new ArrayList<>();

    Files.walkFileTree(pathToDir, new SimpleFileVisitor<Path>() {
        @Override
        public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
            if (Files.isRegularFile(file)) {
                pathsToFiles.add(file);
            }
            return FileVisitResult.CONTINUE;
        }
    });

    return pathsToFiles;
}
public List findAllFilesInDirectory(路径pathToDir)引发IOException{
最终列表pathsToFiles=new ArrayList();
walkFileTree(pathToDir,新的SimpleFileVisitor()){
@凌驾
公共文件VisitResult visitFile(路径文件,基本文件属性属性属性)引发IOException{
if(Files.isRegularFile(file)){
pathsToFiles.add(文件);
}
返回FileVisitResult.CONTINUE;
}
});
返回路径文件;
}
要使用NIO.2,您必须至少有一个Java1.7版本

文件:

教程:


你应该检查一下这个答案:好吧,最好的答案在那里,他们给出错误的第二个答案。例如,如果起始文件夹中只有两个文件夹,则listFiles()会出现错误。这是我的问题,它们使用相同的函数。如果是这种情况,请留下评论,以便其他人知道这种方法的局限性。您使用的是什么版本的java?在Java8中,您可以使用以下两个目录:其中的两个目录是什么?此方法不会列出父目录。为什么要将文件转换为字符串以将其传递给递归调用,然后再将其从字符串转换为文件?我将文件夹位置作为字符串传递,我们可以直接传递文件,就像
else if(File.isDirectory()){listf(File,files);}
并将方法定义更改为
public void listf(文件文件,列表文件)
@Abhi但为什么<代码>文件
已经是文件/文件夹的抽象表示,其中包含所需的所有信息…您似乎只是为了重新创建它而丢弃数据。。。