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.

È stato utile?

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)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top