src/windows/classes/sun/nio/fs/WindowsFileSystemProvider.java

Print this page

        

@@ -350,24 +350,39 @@
         } finally {
             aclBuffer.release();
         }
     }
 
-    @Override
-    public void checkAccess(Path obj, AccessMode... modes) throws IOException {
-        WindowsPath file = WindowsPath.toWindowsPath(obj);
-        // if no access modes then simply file attributes
-        if (modes.length == 0) {
-            file.checkRead();
+    /**
+     * Checks if the given file(or directory) exists and is readable.
+     */
+    private void checkReadAccess(WindowsPath file) throws IOException {
             try {
-                WindowsFileAttributes.get(file, true);
+            Set<OpenOption> opts = Collections.emptySet();
+            FileChannel fc = WindowsChannelFactory
+                .newFileChannel(file.getPathForWin32Calls(),
+                                file.getPathForPermissionCheck(),
+                                opts,
+                                0L);
+            fc.close();
             } catch (WindowsException exc) {
+            // Windows errors are very inconsistent when the file is a directory
+            // (ERROR_PATH_NOT_FOUND returned for root directories for example)
+            // so we retry by attempting to open it as a directory.
+            try {
+                new WindowsDirectoryStream(file, null).close();
+            } catch (IOException ioe) {
+                // translate and throw original exception
                 exc.rethrowAsIOException(file);
             }
-            return;
+        }
         }
 
+    @Override
+    public void checkAccess(Path obj, AccessMode... modes) throws IOException {
+        WindowsPath file = WindowsPath.toWindowsPath(obj);
+
         boolean r = false;
         boolean w = false;
         boolean x = false;
         for (AccessMode mode: modes) {
             switch (mode) {

@@ -376,10 +391,17 @@
                 case EXECUTE : x = true; break;
                 default: throw new AssertionError("Should not get here");
             }
         }
 
+        // special-case read access to avoid needing to determine effective
+        // access to file; default if modes not specified
+        if (!w && !x) {
+            checkReadAccess(file);
+            return;
+        }
+
         int mask = 0;
         if (r) {
             file.checkRead();
             mask |= FILE_READ_DATA;
         }