Есть ли способ проверить, является ли файл специальным файлом блока в Java? - PullRequest
2 голосов
/ 18 июня 2020

У меня есть особый случай использования, когда мне нужно проверить, является ли файл специальным блочным файлом (только если моя программа java запущена на Linux). Мой код уже может определить, запущен ли он на Windows или Linux, поэтому, если это windows, я просто аннулирую проверку.

Для Linux я читал о различных FileAttributeView интерфейсах; и первое, что появилось, было использовать PosixFileAttributeView (поскольку файлы блочных и символьных устройств - это Linux -specifi c), но после дальнейшего изучения его Javado c он дает только доступ к различным RWX (права на чтение, запись, выполнение относительно владельца, группы и других), но ничего о специальных файлах блоков или других атрибутах файлов. С другой стороны, BasicFileAttributeView поддерживается всеми файловыми системами и имеет метод экземпляра, называемый isOther(), это может работать, но должен быть какой-то другой способ, более конкретный c, чем просто знать, что Файл не является обычным файлом, каталогом или символической ссылкой. Знать, что это something other, слишком расплывчато ... Любая помощь приветствуется.

1 Ответ

1 голос
/ 18 июня 2020

Вау, это на самом деле сложнее, чем я представлял!

Чтобы обосновать это в Linux, вы ищете поле st_mode из системного вызова stat() (в C -Мир). Его различные значения указывают, является ли файл символьным устройством, блочным устройством, каталогом и т. Д. c ... Первый символ в каждой строке возврата из ls -la представляет это поле: b для блочного устройства, d для каталога, - для обычного файла и т. д. Например, если вы запустите ls -la /dev/sda, вы, вероятно, получите что-то вроде brw-rw---- 1..., потому что sda - это блочное устройство. Первая строка ls -la /opt будет dr-xr-xrx..., поскольку opt - это каталог.

(https://linux.die.net/man/2/stat, для справки)

Ковырять в Javadocs , Я не нашел класса файла, который разрешает прямой доступ к этому полю st_mode. Как вы упомянули, существуют способы определить, является ли файл каталогом, файлом или другим, но этого недостаточно, чтобы различать guish между всеми параметрами и выяснить, является ли это блочным устройством.

Я нашел этот проект , который, похоже, позволяет вам получить эту stat() структуру в Java. Это изрядно накладные расходы. Возможно, вам удастся извлечь фрагменты, необходимые для этого приложения, но это может быть нетривиально. Специфический метод c, который вам нужно вызвать, - это isBlockDev()

Надеюсь, что это немного поможет, любопытно посмотреть, поймете ли вы что-то или есть лучший ответ там!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...