windows - Sådan får du fil MFT-indgang/inode ved hjælp af Java eller C ++

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har skrevet en duplikat finder i Java, men jeg skal medtage hard link support til det. Desværre synes der ikke at være nogen måde at grave ud en fils MFT-indgang i Java.


Selv om der findes en metode kaldet fileKey () i BasicFileAttributeView-klassen, har den ikke arbejdet med NTFS-filsystemet (jeg har ikke testet det på EX endnu).


Jeg fandt også metoden isSameFile () (i java.nio.file.Path). Ved nogen hvordan denne metode virker? Det ser ud til at være det rigtige, men det returnerer en boolsk værdi, så det er værdiløst for mig (jeg ønsker at sætte resultaterne i et kort og gruppere dem ved deres MFT-indgange). [16]


Jeg kan altid sammenligne oprettelsestider, modifikationstider osv. For hver fil, men det giver bare op.


Er der nogen måde at opnå, hvad jeg forsøger at gøre i enten C ++ eller Java? Jeg bryr mig mere om at få det til at fungere på NTFS end ext.

Bedste reference


Du skal bruge strukturen FILE\_ID\_FULL\_DIRECTORY\_INFORMATION sammen med funktionen NtQueryDirectoryFile (eller FILE\_INTERNAL\_INFORMATION sammen med NtQueryInformationFile, hvis du allerede har et håndtag) inde i ntdll.dll (tilgængelig siden Windows XP, hvis ikke tidligere) for at få 8-byte-fil-id'erne og kontrollere, om de er de samme. [17] [18] [19] [20]


Dette vil fortælle dig, om de er den samme fil , men ikke hvis de er de samme stream af samme fil.


Jeg er ikke sikker på, hvordan man kan opdage, om to filer er den samme strøm fra brugertilstand - der er en struktur med navnet FILE\_STREAM\_INFORMATION, som kan returnere alle strømmer, der er forbundet med en fil, men det fortæller dig ikke < em> som stream du har åbnet for øjeblikket. [21]

Andre referencer 1


Opdagelse af hard links udføres normalt ved at kalde FindFirstFileNameW. Men der er en lavere niveau måde. [22]


For at få NTFS til at svare til inoder, prøv FSCTL\_GET\_OBJECT\_ID ioctl-koden. [23]


Der er en unik (indtil filen er slettet) identifikator i strukturen BY\_HANDLE\_FILE\_INFORMATION. [24]


Hvis volumenet har en aktiveret USN Change Journal, kan du udstede FSCTL\_READ\_FILE\_USN\_DATA ioctl-koden. Kontroller FileReferenceNumber medlemmet i strukturen USN\_RECORD [25] [26]

Andre referencer 2


I Java kan du bruge sun.nio.ch.FileKey, hvilket er et ikke-gennemsigtigt kabinet til NTFS Inode. Alle de hårde links deler samme Inode.


Derfor kan du oprette FileKey fra hver mistanke og sammenligne dem, hvis du har brug for at indsamle vanskelige links (f.eks. Ved at sætte par af FileKey -> Fil i en Multimap)