Почему Files.isHidden (Path) возвращает false для каталогов в Windows? - PullRequest
0 голосов
/ 15 декабря 2018

Из документации Files.isHidden(Path) ( выделение мое):

Указывает, считается ли файл скрытым .Точное определение скрытого зависит от платформы или поставщика.Например, в UNIX файл считается скрытым, если его имя начинается с символа точки ('.'). В Windows файл считается скрытым, если он не является каталогом и установлен атрибут скрытого DOS.

В зависимости от реализации этот метод может требовать доступа к файловой системе, чтобы определить, является лифайл считается скрытым.

Из этого я могу понять что такое ожидаемое поведение.Однако почему это ожидаемое поведение?

Причина, по которой я задаюсь вопросом, заключается в разнице в поведении между Files.isHidden, DosFileAttributes.isHidden и Windows * File Explorer .Например, я могу зайти в File Explorer и установить каталог, который будет скрыт, и он больше не будет отображаться (если я не настрою его для отображения скрытых элементов).Если я проверю, является ли указанный каталог скрытым с помощью Java, Files.isHidden возвращает false и DosFileAttributes.isHidden возвращает true.Вы можете проверить это с помощью следующего кода:

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.attribute.DosFileAttributes;

public class Main {

  public static void main(String[] args) throws Exception {  
    final var directory = Path.of(args[0]).toAbsolutePath().normalize();
    final var store     = Files.getFileStore(directory);
    final var dosAttrs  = Files.readAttributes(directory, DosFileAttributes.class);

    System.out.println("Directory     : " + directory);
    System.out.println("FileStore     : " + store.name() + " [" + store.type() + "]");
    System.out.println("Hidden (Files): " + Files.isHidden(directory));
    System.out.println("Hidden (Dos)  : " + dosAttrs.isHidden());
  }

}

Примечание: я использую Windows 10 и OpenJDK 11.0.1.Моя файловая система - NTFS .


. Выполнение этого с:

java Main.java C:\path\to\hidden\directory

Я получаю:

Directory     : C:\path\to\hidden\directory
FileStore     : OS [NTFS]
Hidden (Files): false
Hidden (Dos)  : true

Примечание: Такое поведение является частью WindowsFileSystemProvider.Метод Files.isHidden(Path) просто перенаправляет вызов поставщику FileSystem аргумента.Реализация в основном:

DosFileAttributes attrs = ...; // get attributes
return !attrs.isDirectory() && attrs.isHidden();

Я нашел это (non) -issue (JDK-8170334), где комментарий говорит:

Я не думаю, что у нас есть ошибка, потому что скрытый атрибут не имеет смысла для каталогов.

Тем не менее File Explorer , который является основным программным обеспечением в Windows, ведет себя какскрытый атрибут не не имеет смысла для каталогов.Итак, еще раз, почему реализация Java в Windows учитывает, указывает ли Path на каталог?Или Java корректна и File Explorer делает нестандартные вещи?

Я склонен думать, что File Explorer является правильным, потому что оба CMD (через dir) и PowerShell (через Get-ChildItem) также не будут отображать скрытые каталоги;нет, если не указаны соответствующие параметры.

1 Ответ

0 голосов
/ 15 декабря 2018

Я проверил документацию для атрибутов файла, предоставленных Microsoft для платформы Windows.Это говорит о том, что если установлен атрибут FILE_ATTRIBUTE_HIDDEN = 2 (0x2)

Файл или каталог скрыты.Он не включен в обычный список каталогов.

Как я вижу в классе sun.nio.fs.WindowsConstants, существует такое же определение значения, которое используется методом DosFileAttributes.isHidden () - public static final int FILE_ATTRIBUTE_HIDDEN = 0x00000002;, которое для моегопонимание должно отображаться один в один с атрибутом, доступным для Windows, поэтому в общем случае флаг hidden для каталога должен работать так же, как и для обычного файла.Что касается интеграции операционной системы и файловой системы, это поведение кажется неправильным.

...