如何列出当前目录中的文件?

41

我希望能够列出当前目录中的文件。我已经做了一些东西,理论上应该可以工作,但没有返回所有文件名。

File dir = new File(".");
File[] filesList = dir.listFiles();
for (File file : filesList) {
    if (file.isFile()) {
        System.out.println(file.getName());
    }
}
它返回.classpath,但我很确定这个文件夹里还有其他Java文件。也许当前文件夹的点表示法不正确?

1
"我相当确定这个文件夹里还有其他的Java文件。请给它们命名(这样我们就可以更加确定了)。” - Andrew Thompson
1
我认为你的代码和输出没有问题。 - Maroun
1
不用说,子目录不会被列出,它们的内容也不会被列出。 - Joop Eggen
3
"也许当前文件夹的点表示法是不正确的?" 打印 File.getCanonicalFile() 的结果以检查路径。 - Andrew Thompson
1
我想我可能找到了问题所在。我假设当前目录位于src文件夹(eclipse),但实际上点符号指向src文件夹外的文件夹。然而,src文件夹是我保存文件的文件夹 - 因此我认为那应该是当前文件夹。有人能解释一下为什么src不是当前文件夹吗? - Martynogea
显示剩余5条评论
7个回答

37

尝试这个,可以检索文件夹及其子文件夹中的所有文件

public static void main(String[]args)
    {
        File curDir = new File(".");
        getAllFiles(curDir);
    }
    private static void getAllFiles(File curDir) {

        File[] filesList = curDir.listFiles();
        for(File f : filesList){
            if(f.isDirectory())
                getAllFiles(f);
            if(f.isFile()){
                System.out.println(f.getName());
            }
        }

    }

仅检索文件/文件夹

public static void main(String[]args)
    {
        File curDir = new File(".");
        getAllFiles(curDir);
    }
    private static void getAllFiles(File curDir) {

        File[] filesList = curDir.listFiles();
        for(File f : filesList){
            if(f.isDirectory())
                System.out.println(f.getName());
            if(f.isFile()){
                System.out.println(f.getName());
            }
        }

    }

我猜这里的用户是想打印出当前目录中所有存在的文件...而不是子目录中的文件! - Vishal K

12

可能当前文件夹的点符号表示法不正确?

打印File.getCanonicalFile()的结果以检查路径。

有人能解释一下为什么src不是当前文件夹吗?

您的IDE在调用JVM时设置了类路径。

例如(针对Netbeans),如果您选择菜单文件 | 项目属性(所有类),则可以看到类似于以下内容:

Netbeans project options

这里感兴趣的是工作目录


3

我快速搜索了一下,但这看起来应该可以工作。不过我还没有测试过。

    File f = new File("."); // current directory

    File[] files = f.listFiles();
    for (File file : files) {
        if (file.isDirectory()) {
            System.out.print("directory:");
        } else {
            System.out.print("     file:");
        }
        System.out.println(file.getCanonicalPath());
    }

3

您应该验证new File(".")指向的位置是否与您所想的相同- .classpath 表明是一些Eclipse项目的根目录...


13
你应该把这个变成一条评论。 - Andrew Thompson

1
你的代码没有问题。它应该列出由指定目录直接包含的所有文件和目录。
问题很可能是以下之一:
- “。”目录不是您期望的目录。路径名“。”实际上意味着JVM的“当前目录”或“工作目录”。您可以通过打印dir.getCanonicalPath()来验证“。”实际上是什么目录。 - 您误解了dir.listFiles()返回的内容。它不会返回dir下所有对象(文件,目录,符号链接等)的树。它只返回直接在dir中的对象(文件,目录,符号链接等)。
“.classpath”文件表明您正在查看Eclipse项目目录,而Eclipse项目通常配置为将Java文件放在子目录中,例如“./src”。我不希望在“。”目录中看到任何Java源代码。

有人能解释一下为什么src不是当前文件夹吗?

假设您在Eclipse中启动应用程序,则当前文件夹默认为项目目录。您可以通过启动器配置向导中的一个面板更改默认当前目录。


转载我的其他评论,“我想我可能已经找到了问题所在。我假设当前目录在src文件夹(eclipse)内,但实际上点符号指向src文件夹之外的文件夹。但是,src文件夹是我保存文件的文件夹 - 因此我认为那应该是当前文件夹。有人能向我解释一下为什么src不是当前文件夹吗?” - Martynogea

0

我在本地目录中使用了这个答案(例如E://),对于第一个目录它可以正常工作,但是对于第二个目录输出会出现Java空指针异常。经过查找原因,我发现问题是由隐藏目录造成的,而这个目录是由Windows创建的。为了避免这个问题,只需使用以下方法:

public void recursiveSearch(File file ) {
 File[] filesList = file.listFiles();
    for (File f : filesList) {
        if (f.isDirectory() && !f.isHidden()) {
            System.out.println("Directoy name is  -------------->" + f.getName());
            recursiveSearch(f);
        }
        if( f.isFile() ){
            System.out.println("File name is  -------------->" + f.getName());
        }
    }
}

0

如果您从命令行单独编译和运行代码,那么您的代码将会得到预期结果。在Eclipse中,每个项目默认的工作目录是项目目录,这就是为什么您会得到这个结果。

您可以在Java中设置user.dir属性:

   System.setProperty("user.dir", "absolute path of src folder");

然后它将会给出预期的结果。


嗯...这样行不通。在纯Java中,无法更改new File(".")的含义。 - Stephen C
参考:https://dev59.com/w3RA5IYBdhLWcg3wwwvD - Stephen C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接