提交 b1da5910 编写于 作者: K khazra

7168172: (fs) Files.isReadable slow on Windows

Summary: Remove DACL checking for read access, also reviewed by Ulf.Zibis@CoSoCo.de, zhong.j.yu@gmail.com
Reviewed-by: alanb
上级 834d39a5
......@@ -352,19 +352,34 @@ public class WindowsFileSystemProvider
}
}
@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 {
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 {
WindowsFileAttributes.get(file, true);
} catch (WindowsException exc) {
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;
......@@ -378,6 +393,13 @@ public class WindowsFileSystemProvider
}
}
// 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();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册