JDK-4803836 : File.listFiles() returns null for 'System Volume Information' / unreadable dir
  • Type: Bug
  • Component: core-libs
  • Sub-Component: java.io
  • Affected Version: 1.4.1,5.0
  • Priority: P4
  • Status: Closed
  • Resolution: Duplicate
  • OS: windows_2000,windows_xp
  • CPU: x86
  • Submitted: 2003-01-15
  • Updated: 2009-02-17
  • Resolved: 2009-02-17
Related Reports
Duplicate :  
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) 
======================================================================

Comments
EVALUATION Unfortunately listFiles is specified to return null when an I/O error occurs (an access denied in this case). The new file system API in jdk7 will throw the expected expectation for this case.
17-02-2009

EVALUATION Accepted. ###@###.### 2003-01-21
21-01-2003