I’ve written a duplicate finder in Java, but I need to include hard link support for it. Unfortunately, there seems to be no way to dig out a file’s MFT entry in Java.
Although there is a method called fileKey() in the BasicFileAttributeView class, it won’t work on the NTFS file system (I haven’t tested it on ext yet).
I also found the method isSameFile() (in java.nio.file.Path). Does anyone know how this method works? It seems to be doing the right thing, but it returns a Boolean value, so it is worthless for me (I wish to put the results into a map and group them by their MFT entries).
I can always compare the creation times, modification times, etc. for each file, but this is just giving up.
Is there any way to accomplish what I am trying to do in either C++ or Java? I care more about making it work on NTFS than ext.
You would need to use the
FILE_ID_FULL_DIRECTORY_INFORMATIONstructure along with theNtQueryDirectoryFilefunction (or theFILE_INTERNAL_INFORMATIONstructure along with theNtQueryInformationFile, if you already have a handle) insidentdll.dll(available since Windows XP, if not earlier) to get the 8-byte file IDs and check if they are the same.This will tell you if they are the same file, but not if they are the same stream of the same file.
I’m not sure how to detect if two files are the same stream from user-mode — there is a structure named
FILE_STREAM_INFORMATIONwhich can return all the streams associated with a file, but it doesn’t tell you which stream you have currently opened.