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;
}