Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-4803836

File.listFiles() returns null for 'System Volume Information' / unreadable dir

    Details

    • Type: Bug
    • Status: Closed
    • Priority: P4
    • Resolution: Duplicate
    • Affects Version/s: 1.4.1, 5.0
    • Fix Version/s: None
    • Component/s: core-libs
    • Subcomponent:
    • CPU:
      x86
    • OS:
      windows_2000, windows_xp

      Description

      Name: nt126004 Date: 01/15/2003


      FULL PRODUCT VERSION :
      java version "1.4.1"
      Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.1-b21)
      Java HotSpot(TM) Client VM (build 1.4.1-b21, mixed mode)

      FULL OPERATING SYSTEM VERSION :
      Microsoft Windows 2000 [Version 5.00.2195]

      A DESCRIPTION OF THE PROBLEM :
      When recursing through all folders on a drive, the 'System Volume Information' special directory is found on each
      drive. File.isDirectory() returns true for this directory, but File.listFiles() returns null, contrary to the documentation.
      This requires an extra null check which should not be necessary.

      However, I do not have read access to this (System Volume Information)
      directory. I am assuming that this falls into the second condition for
      File.listFiles() returning a null, that an I/O error has occured.

      I would have expected the method to throw an IOException in
      this case, to indicate why the operation can't be completed, but I guess
      that wouldn't really improve anything.

      Perhaps the JavaDoc documentation could clarify the read access point?
      e.g.

      "Returns: An array of abstract pathnames denoting the files and
      directories in the directory denoted by this abstract pathname. The
      array will be empty if the directory is empty. Returns null if this
      abstract pathname does not denote a directory, or if an I/O error
      occurs, for example, if the user does not have read access to the
      directory."

      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      See source code. Run this method, starting with the root of each drive (using listRoots()).

      EXPECTED VERSUS ACTUAL BEHAVIOR :
      I would expect either: isDirectory() = false, if the System Volume Information is not regarded as a true directory,
      or listFiles() to return an array (possibly empty) if System Volume Information _is_ regarded as a directory.

      REPRODUCIBILITY :
      This bug can be reproduced always.

      ---------- BEGIN SOURCE ----------

      public void scan(File file)
      throws Exception // file must be a folder
      {
      File[] files = file.listFiles();
      if (files != null)
      {
      for (int i = 0; i < files.length; i++)
      {
      if (files[i].isDirectory())
      {
      scan(files[i]);
      }
      }
      }
      else
      {
      System.out.println("Unexpected null file list for " + file);
      }
      }

      ---------- END SOURCE ----------

      CUSTOMER WORKAROUND :
      Test for null when calling listFiles()
      (Review ID: 179095)
      ======================================================================

        Attachments

          Issue Links

            Activity

              People

              • Assignee:
                alanb Alan Bateman
                Reporter:
                nthompsosunw Nathanael Thompson (Inactive)
              • Votes:
                0 Vote for this issue
                Watchers:
                0 Start watching this issue

                Dates

                • Created:
                  Updated:
                  Resolved:
                  Imported:
                  Indexed: