java 提取根目录下所有文件及文件夹遇到的特殊问题

发布时间 2023-04-17 22:28:11作者: 程序貓

一般在学习java,需要用到File类来提取文件和文件夹,按照很多教程来写,基本都能做到

package exam;

import java.io.File;
import java.util.ArrayList;

public class ExtractingFiles {
    String path;
    ExtractingFiles(String path){
        this.path = path;
    }
    ArrayList<String> start() {
        ArrayList<String> files = new ArrayList<String>();
        File a = new File(this.path);

        if(a.isDirectory()){
            File[] S = a.listFiles();
            for(int i =0;i<S.length;i++) {
                System.out.println(S[i]);
                File f = new File(S[i].getPath());
                {
                    if (f.isDirectory()) {
                        ExtractingFiles as = new ExtractingFiles(f.getPath());
                        files.addAll(as.start());
                    } else {
                        files.add(f.getPath());
                    }
            }
        }else {
            System.out.println("这个目录不存在:"+a);
        }
        return files;
    }

}

但是,如果输入根目录,一般会报这样的错:
在这里插入图片描述
实际上,这是因为根目录下有隐藏文件,且这些文件被加了权限,一般无法访问。这就导致明明是确定的路径,却无法读取里面内容的情况。导致File变量是空。
所以,可以加一个判断隐藏文件的方法

package exam;

import java.io.File;
import java.util.ArrayList;

public class ExtractingFiles {
    String path;
    ExtractingFiles(String path){
        this.path = path;
    }
    ArrayList<String> start() {
        ArrayList<String> files = new ArrayList<String>();
        File a = new File(this.path);

        if(a.isDirectory()){
            File[] S = a.listFiles();
            for(int i =0;i<S.length;i++) {
                System.out.println(S[i]);
                File f = new File(S[i].getPath());
//                 File.isHidden()是判断文件是否为隐藏,因为根目录下有一些存放缓存的文件夹,且是隐藏状态,可以用这个来排出隐藏文件
                if (f.isHidden()) {
                } else {
                    if (f.isDirectory()) {
                        ExtractingFiles as = new ExtractingFiles(f.getPath());
                        files.addAll(as.start());
                    } else {
                        files.add(f.getPath());
                    }
                }
            }
        }else {
            System.out.println("这个目录不存在:"+a);
        }
        return files;
    }

}

这样,就不会出问题


其实,不只是java,其他语言读取根目录都会有这个问题