【问题标题】:How can i get all the list of directories and files in a drive in java. (All files in C:\)如何在 java 中获取驱动器中的所有目录和文件列表。 (C:\ 中的所有文件)
【发布时间】:2015-06-06 09:15:46
【问题描述】:

我正在用 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() 提取所选目录中的所有电影文件名。当用户选择目录时,代码运行良好。

但是,JavaFx 也允许用户选择驱动器(我正在使用目录选择器)。比如他在系统中选择了c盘(c:)。

文件夹的值 = 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(Unknown Source)

【问题讨论】:

  • 您是否尝试对其进行调试以查看它获得 NPE 的确切位置?
  • 我们可以看到堆栈跟踪吗?哪条线在抛出 NPE?
  • 每次程序没有足够的权限来执行目录列表时,您的代码都会引发 NPE。
  • 由于您使用的是 JavaFX,我假设您使用的是 Java 7 或更高版本。这意味着您根本不应该使用 java.io.File 类,因为它的错误报告很差。请改用PathFiles。要递归列出文件,请使用 Files 的 walkFileTree 方法之一(如果您使用的是 Java 8,则使用 walk)。
  • 添加了 NPE 的确切原因。 @VGR:是的。我正在使用 java 8。感谢您的建议。是的,使用 walkfileTree 更有意义。

标签: java


【解决方案1】:

我注意到您对不同的 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);

【讨论】:

  • movieFilter 函数仅用于清理movieFile 名称。该函数不会导致NPE。NPE 是在为驱动器执行listFiles() 时发生的。文件根文件夹 = new File("C:\\");获取文件名(根文件夹);将导致 NPE。有没有办法列出驱动器中的文件?
  • 嗨,Rahul,感谢您提供详细信息。我的解决方案不起作用吗?还是你没有测试? =(
  • No.Unfortunately.It didn't work..它在文件上尝试 listFiles() 时仍然抛出 NPE。
  • 好的。能否调试一下代码,看看 NPE 出现在哪一行?
猜你喜欢
  • 1970-01-01
  • 2010-12-01
  • 2011-03-02
  • 1970-01-01
  • 2010-11-30
  • 1970-01-01
  • 2014-09-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多