Из документации 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
) также не будут отображать скрытые каталоги;нет, если не указаны соответствующие параметры.