JDK-4506747 : Accessing Removable drives pops up dialog box from java native code
  • Type: Bug
  • Component: core-libs
  • Sub-Component: java.io
  • Affected Version: 1.3.1,1.3.1_03
  • Priority: P3
  • Status: Closed
  • Resolution: Duplicate
  • OS: windows_2000
  • CPU: x86
  • Submitted: 2001-09-25
  • Updated: 2003-03-11
  • Resolved: 2003-03-11
Related Reports
Duplicate :  
Description

Name: ddT132432			Date: 09/25/2001


java version "1.3.1"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.3.1-b24)
Java HotSpot(TM) Client VM (build 1.3.1-b24, mixed mode)

Accessing Removable Drives through java.io.File causes java.exe to pop up a
dialog when no disk is inserted saying the drive is not available.  This does
not happen on all computers.  A description of an example computer is included
below.  The problem is somewhere in the java native code, maybe in
FileSystem.checkAccess ??  One developer thinks it may only be a problem on
machines with SCSI devices, since it does not occur on all our machines, though
I have not verified that this is the case.

/******** START SOURCE **********************************************/

import java.io.File;
import java.util.Properties;
import java.util.Iterator;
import java.util.Set;

public class RootFileAccess {

    public static void main(String args[]) {

        Properties props = System.getProperties();
        Set pSet = props.keySet();

        Iterator iter = pSet.iterator();
        while(iter.hasNext()) {
            String next = (String)iter.next();
            System.out.println(next + " == " + (String)props.get(next));
        }

        File[] roots = File.listRoots();

        System.out.println("=================================");
        for(int x=0; x<roots.length; x++) {
            System.out.println("Drive " + x + ": " + roots[x].getAbsolutePath());
            try {
                System.out.println("Drive " + x + ": " + roots [x].getCanonicalPath());
            } catch(Exception exc) {
                System.out.println("Drive " + x + ": threw exception on cannonical path" );
                exc.printStackTrace();
            }

            try {
                if(roots[x].canRead()) {
                    System.out.println("Drive " + x + " is readable");
                } else {
                    System.out.println("Drive " + x + " is NOT readable");
                }
            } catch(Exception exc) {
                System.out.println("Drive " + x + ": threw exception on read check" );
                exc.printStackTrace();
            }

            try {
                if(roots[x].exists()) {
                    System.out.println("Drive " + x + " exists");
                } else {
                    System.out.println("Drive " + x + " does NOT exist");
                }
            } catch(Exception exc) {
                System.out.println("Drive " + x + ": threw exception on existence check" );
                exc.printStackTrace();
            }

            try {
                if(roots[x].isDirectory()) {
                    System.out.println("Drive " + x + " is directory");
                } else {
                    System.out.println("Drive " + x + " is NOT directory");
                }
            } catch(Exception exc) {
                System.out.println("Drive " + x + ": threw exception on directory check" );
                exc.printStackTrace();
            }
            System.out.println("===================================");

        }

    }
}
/********** END SOURCE *********************************************/

/***** START OUTPUT *********/

D:\temp>java RootFileAccess
java.runtime.name == Java(TM) 2 Runtime Environment, Standard Edition
sun.boot.library.path == d:\java\jdk1.3.1\jre\bin
java.vm.version == 1.3.1-b24
java.vm.vendor == Sun Microsystems Inc.
java.vendor.url == http://java.sun.com/
path.separator == ;
java.vm.name == Java HotSpot(TM) Client VM
file.encoding.pkg == sun.io
java.vm.specification.name == Java Virtual Machine Specification
user.dir == D:\temp
java.runtime.version == 1.3.1-b24
java.awt.graphicsenv == sun.awt.Win32GraphicsEnvironment
os.arch == x86
java.io.tmpdir == C:\DOCUME~1\BMORIA~1\LOCALS~1\Templine.separator ==

java.vm.specification.vendor == Sun Microsystems Inc.
java.awt.fonts ==
os.name == Windows 2000
java.library.path == d:\java\jdk1.3.1\bin;.;C:\WINNT\System32;C:\WINNT;d:\usr\lo
cal\bin;d:\usr\bin;d:\java\jdk1.3.1\bin;d:\home\bmoriarty\bin;d:\usr\local\vim\v
im60aq;d:\java\jdk1.3.1\jre\bin\classic;d:\java\jakarta-ant-1.3\bin;d:\usr\perlbin;C:\WINNT\system32;d:\programs\DISA\dii_dev\bin;d:\home\bmoriarty\src\polexis
\xistm\bin;d:\home\bmoriarty\src\viking\bin;d:\home\bmoriarty\src\polexis\memtes
t\bin
java.specification.name == Java Platform API Specification
java.class.version == 47.0
os.version == 5.0
user.home == C:\Documents and Settings\bmoriarty
user.timezone ==
java.awt.printerjob == sun.awt.windows.WPrinterJob
file.encoding == Cp1252
java.specification.version == 1.3
java.class.path == .
user.name == bmoriarty
java.vm.specification.version == 1.0
java.home == d:\java\jdk1.3.1\jre
user.language == en
java.specification.vendor == Sun Microsystems Inc.
awt.toolkit == sun.awt.windows.WToolkit
java.vm.info == mixed mode
java.version == 1.3.1
java.ext.dirs == d:\java\jdk1.3.1\jre\lib\ext
sun.boot.class.path == d:\java\jdk1.3.1\jre\lib\rt.jar;d:\java\jdk1.3.1\jre\libi18n.jar;d:\java\jdk1.3.1\jre\lib\sunrsasign.jar;d:\java\jdk1.3.1\jre\classes
java.vendor == Sun Microsystems Inc.
file.separator == java.vendor.url.bug == http://java.sun.com/cgi-bin/bugreport.cgi
sun.io.unicode.encoding == UnicodeLittle
sun.cpu.endian == little
user.region == US
sun.cpu.isalist == pentium i486 i386
=================================================================
Drive 0: A:Drive 0: threw exception on cannonical path
java.io.IOException: The device is not ready
        at java.io.Win32FileSystem.canonicalize(Native Method)
        at java.io.File.getCanonicalPath(File.java:440)
        at RootFileAccess.main(RootFileAccess.java:30)
Drive 0 is NOT readable
Drive 0 does NOT exist
Drive 0 is NOT directory
=================================================================
Drive 1: C:Drive 1: C:Drive 1 is readable
Drive 1 exists
Drive 1 is directory
=================================================================
Drive 2: D:Drive 2: D:Drive 2 is readable
Drive 2 exists
Drive 2 is directory
=================================================================
Drive 3: E:Drive 3: threw exception on cannonical path
java.io.IOException: The device is not ready
        at java.io.Win32FileSystem.canonicalize(Native Method)
        at java.io.File.getCanonicalPath(File.java:440)
        at RootFileAccess.main(RootFileAccess.java:30)
Drive 3 is NOT readable
Drive 3 does NOT exist
Drive 3 is NOT directory
=================================================================
Drive 4: F:Drive 4: threw exception on cannonical path
java.io.IOException: The device is not ready
        at java.io.Win32FileSystem.canonicalize(Native Method)
        at java.io.File.getCanonicalPath(File.java:440)
        at RootFileAccess.main(RootFileAccess.java:30)
Drive 4 is NOT readable
Drive 4 does NOT exist
Drive 4 is NOT directory
=================================================================
Drive 5: I:Drive 5: I:Drive 5 is readable
Drive 5 exists
Drive 5 is directory
=================================================================

D:\temp>

/******* END OUTPUT *********/

/******* START CONFIG INFO *********/

popups appear on A:\ and e:\  on the machine in the previous example, below
is a description of some of the drives on that machine.

a:type=Floppy disk drive
driver=c:\winnt\System32\DRIVERS\flpydisk.sys

c:\ and d:type=FUJITSU MAJ3182MP SCSI Disk Device
driver provider=Microsoft

e:type=IOMEGA ZIP 250
driver provider=MIcrosoft

f:type=SONY CD-RW CRX160E
driver=c:\WINNT\System32\DRIVERS\cdrom.sys

/******** END CONFIG INFO ***************/
(Review ID: 131512) 
======================================================================

Comments
WORK AROUND Name: ddT132432 Date: 09/25/2001 In one case it was convenient to create a com.xx.FileSystem.listRoots() that caches the available drives the first time it is called. This means that the popups will only appear once since the unavailable drives won't be access after the first check. This helped in one case, but in general this workaround isn't very good, since a user might insert a disk later on, plus I'd rather not see the popups at all. A better work around would be to modify the native java code, but that takes more time to look in to. ======================================================================
11-06-2004

EVALUATION Please see comments ###@###.### 2002-02-14
14-02-2002