Как получить файл mft intry/inode с использованием java или c ++

StackOverflow https://stackoverflow.com/questions/9353733

Вопрос

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

Несмотря на то, что в классе BasicFileAtTributeView есть метод, называемый FileKey (), он не будет работать в файловой системе NTFS (я еще не тестировал его на EXT).

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

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

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

Это было полезно?

Решение

You would need to use the FILE_ID_FULL_DIRECTORY_INFORMATION structure along with the NtQueryDirectoryFile function (or the FILE_INTERNAL_INFORMATION structure along with the NtQueryInformationFile, if you already have a handle) inside ntdll.dll (available since Windows XP, if not earlier) to get the 8-byte file IDs and check if they are the same.

This will tell you if they are the same file, but not if they are the same stream of the same file.

I'm not sure how to detect if two files are the same stream from user-mode -- there is a structure named FILE_STREAM_INFORMATION which can return all the streams associated with a file, but it doesn't tell you which stream you have currently opened.

Другие советы

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

Чтобы получить эквивалент NTFS Inodes, попробуйте FSCTL_GET_OBJECT_ID Ioctl code.

Есть уникальный (пока файл не удален) идентификатор в BY_HANDLE_FILE_INFORMATION структура также.

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top