Come ottenere la voce/inode MFT file utilizzando Java o C ++
-
28-10-2019 - |
Domanda
Ho scritto un Duplicato Finder in Java, ma ho bisogno di includere un supporto di collegamento duro per questo. Sfortunatamente, sembra non esserci modo di scavare la voce MFT di un file in Java.
Sebbene esista un metodo chiamato fileKey () nella classe BasicFileattributeview, non funzionerà sul file system NTFS (non l'ho ancora testato su Ext).
Ho anche trovato il metodo IssameFile () (in java.nio.file.path). Qualcuno sa come funziona questo metodo? Sembra che stia facendo la cosa giusta, ma restituisce un valore booleano, quindi è inutile per me (desidero mettere i risultati in una mappa e raggrupparli dalle loro voci MFT).
Posso sempre confrontare i tempi di creazione, i tempi di modifica, ecc. Per ogni file, ma questo è solo rinunciare.
C'è un modo per realizzare ciò che sto cercando di fare in C ++ o Java? Mi interessa più di farlo funzionare su NTFS che Ext.
Soluzione
Dovresti usare il FILE_ID_FULL_DIRECTORY_INFORMATION
struttura insieme al NtQueryDirectoryFile
funzione (o il FILE_INTERNAL_INFORMATION
struttura insieme al NtQueryInformationFile
, se hai già una maniglia) dentro ntdll.dll
(Disponibile da Windows XP, se non prima) per ottenere gli ID file a 8 byte e verificare se sono uguali.
Questo ti dirà se sono gli stessi file, ma non se sono uguali flusso dello stesso file.
Non sono sicuro di come rilevare se due file sono lo stesso flusso dalla modalità utente-esiste una struttura denominata FILE_STREAM_INFORMATION
che può restituire tutti i flussi associati a un file, ma non te lo dice quale Streaming che hai attualmente aperto.
Altri suggerimenti
Il rilevamento di collegamenti duri viene solitamente realizzato chiamando FindFirstFileNameW
. Ma c'è un modo di livello inferiore.
Per ottenere l'NTFS equivalente agli inodi, prova il FSCTL_GET_OBJECT_ID
Codice IOCTL.
C'è un identificatore univoco (fino a quando il file non è stato eliminato) BY_HANDLE_FILE_INFORMATION
struttura anche.
Se il volume ha un diario di cambiamento USN abilitato, è possibile emettere il FSCTL_READ_FILE_USN_DATA
Codice IOCTL. Controlla il FileReferenceNumber
membro nel USN_RECORD
struttura
In Java puoi usare sun.nio.ch.FileKey
che è un recinto non trasparente per NTFS inode. Tutti i collegamenti difficili condividono lo stesso inodo.
Pertanto, se è necessario raccogliere collegamenti difficili, puoi creare FileKey
da ogni sospetto e confrontali (ad esempio mettendo coppie di fileKey -> file in a Multimap
)