Question

J'ai écrit un chercheur en double en Java, mais je dois inclure le support de lien dur pour elle. Malheureusement, il semble y avoir aucun moyen de creuser une entrée de fichier MFT en Java.

Bien qu'il y ait une méthode appelée fileKey () dans la classe BasicFileAttributeView, il ne fonctionnera pas sur le système de fichiers NTFS (je n'ai pas encore testé sur ext).

Je trouve aussi la méthode isSameFile () (en java.nio.file.Path). Est-ce que quelqu'un sait comment cette méthode fonctionne? Il semble faire la bonne chose, mais il renvoie une valeur booléenne, il est donc sans valeur pour moi (je veux mettre les résultats en une carte et de les regrouper par leurs entrées MFT).

Je peux toujours comparer les temps de création, de modification, temps etc. pour chaque fichier, mais cela est tout simplement abandonner.

Est-il possible d'accomplir ce que je suis en train de faire dans C ++ ou Java? Je me soucie plus de faire fonctionner sur NTFS que poste.

Était-ce utile?

La solution

Vous devez utiliser la structure FILE_ID_FULL_DIRECTORY_INFORMATION en même temps que la fonction NtQueryDirectoryFile (ou FILE_INTERNAL_INFORMATION structure avec la balise NtQueryInformationFile , si vous avez déjà une poignée) à l'intérieur ntdll.dll (disponible depuis Windows XP, sinon plus tôt ) pour obtenir les identifiants de fichiers 8 octets et vérifier si elles sont les mêmes.

Cela vous dira si elles sont les mêmes fichier , mais pas si elles sont les mêmes flux du même fichier.

Je ne sais pas comment détecter si deux fichiers sont le même flux de mode utilisateur - il y a une structure nommée

Autres conseils

La détection des liens durs est habituellement accompli en appelant FindFirstFileNameW . Mais il existe un moyen de niveau inférieur.

Pour obtenir l'équivalent NTFS à inodes, essayez FSCTL_GET_OBJECT_ID Code ioctl.

Il est un identifiant unique (jusqu'à ce que le fichier est supprimé) dans la section structure BY_HANDLE_FILE_INFORMATION ainsi.

Si le volume a un permis USN journal des modifications, vous pouvez utiliser la structure USN_RECORD

En Java, vous pouvez utiliser sun.nio.ch.FileKey qui est une enceinte non transparente pour NTFS Inode. Tous les liens durs partagent la même Inode.

Par conséquent, si vous avez besoin de collecter des liens durs, vous pouvez créer FileKey de chaque suspect et de les comparer (par exemple en mettant des paires de FileKey -> dans un fichier Multimap)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top