Как получить файл MFT записи / inode, используя Java или C ++ - PullRequest
2 голосов
/ 20 февраля 2012

Я написал дубликат поиска в Java, но мне нужно включить поддержку жестких ссылок для него. К сожалению, кажется, что нет способа найти запись MFT файла в Java.

Хотя в классе BasicFileAttributeView есть метод fileKey (), он не будет работать в файловой системе NTFS (я еще не тестировал его на ext).

Я также нашел метод isSameFile () (в java.nio.file.Path). Кто-нибудь знает, как работает этот метод? Кажется, что он делает правильные вещи, но возвращает логическое значение, поэтому он бесполезен для меня (я хочу поместить результаты в карту и сгруппировать их по записям MFT).

Я всегда могу сравнить время создания, время модификации и т. Д. Для каждого файла, но это просто отказ.

Есть ли способ выполнить то, что я пытаюсь сделать, в C ++ или Java? Меня больше заботит, чтобы он работал на NTFS, чем ext.

Ответы [ 3 ]

1 голос
/ 20 февраля 2012

Вам потребуется использовать структуру FILE_ID_FULL_DIRECTORY_INFORMATION вместе с функцией NtQueryDirectoryFile (или структуру FILE_INTERNAL_INFORMATION вместе с NtQueryInformationFile, если у вас уже есть дескриптор) внутри ntdll.dll (доступно начиная с Windows XP, если не раньше), чтобы получить 8-байтовые идентификаторы файлов и проверить, совпадают ли они.

Это скажет вам, если это один и тот же файл , но нет, если они будут одинаковыми поток одного и того же файла.

Я не уверен, какопределить, являются ли два файла одним потоком из пользовательского режима - существует структура с именем FILE_STREAM_INFORMATION, которая может возвращать все потоки, связанные с файлом, но она не сообщает вам , которая поток, который вы в данный момент открыли.

1 голос
/ 20 февраля 2012

Обнаружение жестких ссылок обычно выполняется путем вызова FindFirstFileNameW. Но есть путь более низкого уровня.

Чтобы получить NTFS-эквивалент для inode, попробуйте FSCTL_GET_OBJECT_ID код ioctl.

В структуре BY_HANDLE_FILE_INFORMATION также есть уникальный (до тех пор, пока файл не будет удален) идентификатор.

Если на томе включен журнал изменений USN, вы можете ввести код ioctl FSCTL_READ_FILE_USN_DATA. Проверьте элемент FileReferenceNumber в структуре USN_RECORD

0 голосов
/ 17 января 2017

В Java вы можете использовать sun.nio.ch.FileKey, который является непрозрачным корпусом для NTFS Inode.Все жесткие ссылки имеют один и тот же Inode.

Поэтому, если вам нужно собрать жесткие ссылки, вы можете создать FileKey для каждого подозреваемого и сравнить их (например, поместив пары FileKey -> File в Multimap)

...