2 Stimmen

Wie man mit Java oder C++ einen MFT-Eintrag/-Knoten erhält

Ich habe einen Duplikatsfinder in Java geschrieben, aber ich muss noch Hardlink-Unterstützung für ihn einbauen. Leider scheint es keine Möglichkeit zu geben, den MFT-Eintrag einer Datei in Java auszulesen.

Obwohl es eine Methode namens fileKey() in der BasicFileAttributeView-Klasse gibt, funktioniert sie nicht mit dem NTFS-Dateisystem (ich habe sie noch nicht mit ext getestet).

Ich habe auch die Methode isSameFile() (in java.nio.file.Path). Weiß jemand, wie diese Methode funktioniert? Es scheint das Richtige zu tun, aber es gibt einen booleschen Wert zurück, so dass es für mich wertlos ist (ich möchte die Ergebnisse in eine Karte und gruppieren sie durch ihre MFT-Einträge).

Ich kann immer die Erstellungszeiten, Änderungszeiten usw. für jede Datei vergleichen, aber das ist einfach zu viel des Guten.

Gibt es eine Möglichkeit, das, was ich zu tun versuche, in C++ oder Java zu erreichen? Ich bin mehr daran interessiert, dass es auf NTFS als auf ext funktioniert.

1voto

Ben Voigt Punkte 268424

Die Erkennung von Hard Links erfolgt in der Regel durch den Aufruf von FindFirstFileNameW . Aber es gibt einen Weg auf einer niedrigeren Ebene.

Um das NTFS-Äquivalent zu Inodes zu erhalten, versuchen Sie die FSCTL_GET_OBJECT_ID ioctl-Code.

Es gibt einen eindeutigen Bezeichner (bis die Datei gelöscht wird) in der BY_HANDLE_FILE_INFORMATION Struktur auch.

Wenn das Volume ein aktiviertes USN Change Journal hat, können Sie die FSCTL_READ_FILE_USN_DATA ioctl-Code. Prüfen Sie den FileReferenceNumber Mitglied im USN_RECORD Struktur

1voto

user541686 Punkte 196656

Sie müssen die FILE_ID_FULL_DIRECTORY_INFORMATION Struktur zusammen mit der NtQueryDirectoryFile Funktion (oder die FILE_INTERNAL_INFORMATION Struktur zusammen mit der NtQueryInformationFile (wenn Sie bereits einen Griff haben) in ntdll.dll (verfügbar seit Windows XP, wenn nicht früher), um die 8-Byte-Datei-IDs zu ermitteln und zu prüfen, ob sie gleich sind.

So können Sie feststellen, ob sie identisch sind Datei aber nicht, wenn sie identisch sind Strom der gleichen Datei.

Ich bin nicht sicher, wie man erkennt, ob zwei Dateien derselbe Stream aus dem Benutzermodus sind -- es gibt eine Struktur namens FILE_STREAM_INFORMATION das alle mit einer Datei verknüpften Streams zurückgeben kann, aber es sagt Ihnen nicht die Stream, den Sie gerade geöffnet haben.

0voto

Alexander Kosenkov Punkte 1570

In Java können Sie verwenden sun.nio.ch.FileKey das ein nicht-transparentes Gehäuse für NTFS-Inode ist. Alle Hardlinks teilen sich denselben Inode.

Wenn Sie also harte Links sammeln müssen, können Sie FileKey von jedem Verdächtigen und vergleichen sie (z. B. indem sie Paare von FileKey -> File in ein Multimap )

0voto

Steve Pitchers Punkte 6701

Ich finde fileKey ist immer null. Hier ist etwas Code, der tatsächlich die NTFS-Inode-Nummer lesen kann. Es bleiben viele Aspekte, die ich nicht glücklich mit, nicht zuletzt, es beruht auf Reflexion.

import sun.nio.ch.FileKey;
import java.io.*;
import java.lang.reflect.Field;
import java.nio.file.Path;

class NTFS {
    static long inodeFromPath(Path path) throws IOException, NoSuchFieldException, IllegalAccessException {
        try (FileInputStream fi = new FileInputStream(path.toFile())) {
            FileDescriptor fd = fi.getFD();

            FileKey fk = FileKey.create(fd);
            Field privateField = FileKey.class.getDeclaredField("nFileIndexHigh");
            privateField.setAccessible(true);
            long high = (long) privateField.get(fk);
            privateField = FileKey.class.getDeclaredField("nFileIndexLow");
            privateField.setAccessible(true);
            long low = (long) privateField.get(fk);

            long power = (long) 1 << 32;
            long inode = high * power + low;
            return inode;
        }
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X