Files.isHidden C: \\ изменено между JDK12 и JDK13 в Windows - PullRequest
5 голосов
/ 30 сентября 2019

Files.isHidden(Path.of("c:\\")) возвращает значение true в Windows 10, JDK 13

, но возвращает значение false на том же компьютере JDK 12.

Кто-нибудь знает, почему это так?

Ответы [ 2 ]

6 голосов
/ 30 сентября 2019

Это была ошибка , исправленная в JDK 13.

В Microsoft Windows метод java.nio.file.Files.isHidden исторически игнорировал DOS "скрытый атрибут на каталогах. Это исправлено в этом выпуске, так что теперь isHidden возвращает true при вызове для проверки каталога, для которого установлен этот атрибут.

Из заметок о выпуске

5 голосов
/ 30 сентября 2019

Как уже упоминалось, разница в поведении связана с исправлением ошибки: JDK-8215467 . Описание ошибки объясняет, что до исправления результат Files#isHidden(Path) был несовместим с другим программным обеспечением ядра в Windows (например, File Explorer , PowerShell , CMD и т. Д.). Несоответствие состояло в том, что каталоги в Windows, безусловно, могут быть скрыты, но Java (или, по крайней мере, NIO2) считала иначе.

В комментариях к проблеме было указано, что результат также не соответствует java.io.File#isHidden(). На самом деле, если вы используете:

File file = new File("C:\\");
System.out.println(file.isHidden());

Вы увидите распечатанный true, даже в Java 12 и более ранних версиях (по крайней мере, у меня на моем компьютере с Windows 10 Home).

Факт C:\ сообщается как скрытый, кажется правильным для меня. Если я проверяю атрибуты C:\ в PowerShell , он показывает каталог как скрытый.

PS C:\> $root = Get-Item "C:\"
PS C:\> $root.Attributes
Hidden, System, Directory
...