OpenJDK / amber / amber
changeset 50811:7b259287cdd2
8202076: test/jdk/java/io/File/WinSpecialFiles.java on windows with VS2017
Summary: If all other means to obtain the file length fail, fall back to FindFirstFile
Reviewed-by: igerasim, alanb
author | bpb |
---|---|
date | Tue, 22 May 2018 16:19:31 -0700 |
parents | 408021edf22f |
children | 45093fb73c6d |
files | src/java.base/windows/native/libjava/WinNTFileSystem_md.c test/jdk/java/io/File/WinSpecialFiles.java |
diffstat | 2 files changed, 40 insertions(+), 12 deletions(-) [+] |
line wrap: on
line diff
--- a/src/java.base/windows/native/libjava/WinNTFileSystem_md.c Wed May 23 00:21:58 2018 +0200 +++ b/src/java.base/windows/native/libjava/WinNTFileSystem_md.c Tue May 22 16:19:31 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -35,6 +35,7 @@ #include <direct.h> #include <windows.h> #include <io.h> +#include <limits.h> #include "jni.h" #include "io_util.h" @@ -527,13 +528,40 @@ } } else { if (GetLastError() == ERROR_SHARING_VIOLATION) { - /* The error is "share violation", which means the file/dir - must exists. Try _wstati64, we know this at least works - for pagefile.sys and hiberfil.sys. - */ - struct _stati64 sb; - if (_wstati64(pathbuf, &sb) == 0) { - rv = sb.st_size; + // + // The error is a "share violation", which means the file/dir + // must exist. Try FindFirstFile, we know this at least works + // for pagefile.sys. + // + + WIN32_FIND_DATAW fileData; + HANDLE h = FindFirstFileW(pathbuf, &fileData); + if (h != INVALID_HANDLE_VALUE) { + if ((fileData.dwFileAttributes & + FILE_ATTRIBUTE_REPARSE_POINT) == 0) { + WCHAR backslash = L'\\'; + WCHAR *pslash = wcsrchr(pathbuf, backslash); + if (pslash == NULL) { + pslash = pathbuf; + } else { + pslash++; + } + WCHAR *fslash = wcsrchr(fileData.cFileName, backslash); + if (fslash == NULL) { + fslash = fileData.cFileName; + } else { + fslash++; + } + if (wcscmp(pslash, fslash) == 0) { + ULARGE_INTEGER length; + length.LowPart = fileData.nFileSizeLow; + length.HighPart = fileData.nFileSizeHigh; + if (length.QuadPart <= _I64_MAX) { + rv = (jlong)length.QuadPart; + } + } + } + FindClose(h); } } }
--- a/test/jdk/java/io/File/WinSpecialFiles.java Wed May 23 00:21:58 2018 +0200 +++ b/test/jdk/java/io/File/WinSpecialFiles.java Tue May 22 16:19:31 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -22,7 +22,7 @@ */ /* @test - @bug 6192331 6348207 + @bug 6192331 6348207 8202076 @summary Check if File.exists()/length() works correctly on Windows special files hiberfil.sys and pagefile.sys */ @@ -45,9 +45,9 @@ if (name.indexOf("pagefile.sys") != -1 || name.indexOf("hiberfil.sys") != -1) { if (dir[i].length() == 0) { - throw new Exception("Size of existing <" + throw new Exception("Size of existing file \"" + dir[i].getPath() - + " is ZERO"); + + "\" is ZERO"); } } }