如何在java中获取驱动器中的所有目录和文件列表。 (C:\中的所有文件)

时间:2015-04-01 16:07:36

标签: java

我正在用java FX编写GUI程序。用户可以选择系统中的任何目录。不幸的是,目录选择器让用户也选择了一个驱动器。 我们可以使用file.listFiles()列出目录中的所有文件和文件夹。如果用户选择驱动器会发生什么。 listfiles()失败,空指针异常。

有什么办法可以在java中的驱动器中获取文件和目录列表吗?

    //Get files from the user computer
    public void getFileNames(File folder) {
        for (final File file : folder.listFiles()) {
            if (file.isDirectory()) {
                getFileNames(file);
            } else {
                if (FilenameUtils.isExtension(file.getName().toLowerCase(), videoFormatSet)) {
                    //Don't consider video files less than 100 MB
                    final Long FileSizeInMB = file.length() / 1048576;
                    if (FileSizeInMB < 100) {
                        continue;
                    }
                    final String fileName = FilenameUtils.removeExtension(file.getName());
                    if (!movieNameFilter(fileName).isEmpty()) {
                        movieFileNameList.add(movieNameFilter(fileName));
                    } else {
                        movieFileNameList.add(fileName);
                    }
                }

编辑:

代码允许用户选择目录(文件夹变量)。 getFileNames()提取所选目录中的所有电影文件Name。当用户选择目录时,代码工作正常。

但是,JavaFx也允许用户选择一个驱动器(我正在使用目录选择器)。让我们举例来说,他在系统中选择了c drive(c :)。

file folder = E:\

的值

当我在第171行中执行 folder.listFiles()时,会发生空指针异常

    171: for (final File file : folder.listFiles()) {

我可以通过添加不允许用户选择驱动器的验证来避免这种情况。

但如果我想让他选择一个驱动器。有什么办法可以获得该驱动器中所有文件的列表吗?

简单地说,是否可以编写一个允许用户提供驱动器的代码(例如:C或D),以便它可以显示该驱动器中的所有文件。

堆栈追踪:

线程“Thread-5”中的异常java.lang.NullPointerException     在com.imdbrater.application.JavaFXApplication $ GetfilesThread.getFileNames(JavaFXApplication.java:171)     在com.imdbrater.application.JavaFXApplication $ GetfilesThread.getFileNames(JavaFXApplication.java:173)     在com.imdbrater.application.JavaFXApplication $ GetfilesThread.getFileNames(JavaFXApplication.java:173)     在com.imdbrater.application.JavaFXApplication $ GetfilesThread.run(JavaFXApplication.java:167)     在java.lang.Thread.run(未知来源)

1 个答案:

答案 0 :(得分:2)

我注意到您对不同的movieNameFilter()方法执行了一些调用,这些调用未在您发布的代码段中声明。当你在返回的对象上调用一些方法时,请确保这个方法返回一个正确的值。

你没有发布NullPointerException正在发生的地方,因此我将根据您尝试执行的操作的简单且可能的null输出作为答案。 请确保用户输入的驱动器确实存在。 如the API documentation for java.io.File中所示,

  

<强>返回:

     

一组抽象路径名,表示此抽象路径名表示的目录中的文件和目录。如果目录为空,则数组将为空。 如果此抽象路径名不表示目录,或者发生I / O错误,则返回null。

在这种情况下,如果您的用户输入了不存在的路径,您将获得NPE。

处理此问题的最佳方法是首先验证用户输入。第二步是验证listFiles()来电的输出。

// Get files from the user computer
public void getFileNames(File folder) {

    // retrieve file listing
    File[] fileList = folder.listFiles();

    if (fileList == null) {
        // throw an exception, return or do any other error handling here
        return;
    }

    // path is correct
    for (final File file : fileList ) {
        // etc etc etc
    }
}

如果NPE与任何其他错误有关,请发表评论,以便我可以相应地更新我的答案。


注意:请记住,Java中的文件路径是使用双反斜杠进行转义的,因此您应该按照以下方式进行调用。

File rootFolder = new File("C:\\");
getFileNames(rootFolder);

File downloadsFolder = new File("C:\\Users\\Rahul\\Downloads");
getFileNames(downloadsFolder);