Pregunta

He escrito un buscador duplicado en Java, pero necesito incluir soporte de enlace duro para ello. Desafortunadamente, parece que no hay forma de desenterrar la entrada MFT de un archivo en Java.

Aunque hay un método llamado filekey () en la clase BasicFileAtTributeView, no funcionará en el sistema de archivos NTFS (aún no lo he probado en ext).

También encontré el método issameFile () (en java.nio.file.path). ¿Alguien sabe cómo funciona este método? Parece estar haciendo lo correcto, pero devuelve un valor booleano, por lo que no tiene valor para mí (deseo poner los resultados en un mapa y agruparlos por sus entradas MFT).

Siempre puedo comparar los tiempos de creación, los tiempos de modificación, etc. para cada archivo, pero esto es simplemente rendirse.

¿Hay alguna forma de lograr lo que estoy tratando de hacer en C ++ o Java? Me importa más hacer que funcione en NTFS que ext.

¿Fue útil?

Solución

Necesitaría usar el FILE_ID_FULL_DIRECTORY_INFORMATION estructura junto con el NtQueryDirectoryFile función (o el FILE_INTERNAL_INFORMATION estructura junto con el NtQueryInformationFile, si ya tiene un mango) dentro ntdll.dll (Disponible desde Windows XP, si no anterior) para obtener las ID de archivo de 8 bytes y verificar si son lo mismo.

Esto te dirá si son iguales expediente, pero no si son iguales corriente del mismo archivo.

No estoy seguro de cómo detectar si dos archivos son la misma secuencia del modo de usuario: hay una estructura nombrada FILE_STREAM_INFORMATION que puede devolver todas las transmisiones asociadas con un archivo, pero no le dice cual transmisión que ha abierto actualmente.

Otros consejos

La detección de enlaces duros generalmente se logra llamando FindFirstFileNameW. Pero hay una forma de nivel inferior.

Para obtener el NTFS equivalente a inodes, pruebe el FSCTL_GET_OBJECT_ID Código IOCTL.

Hay un identificador único (hasta que se elimina el archivo) en el BY_HANDLE_FILE_INFORMATION estructura también.

Si el volumen tiene un diario de cambio de USN habilitado, puede emitir el FSCTL_READ_FILE_USN_DATA Código IOCTL. Comprobar el FileReferenceNumber miembro en el USN_RECORD estructura

En Java puedes usar sun.nio.ch.FileKey que es un recinto no transparente para inodo NTFS. Todos los enlaces duros comparten el mismo inodo.

Por lo tanto, si necesita recopilar enlaces duros, puede crear FileKey de cada sospechoso y compararlos (por ejemplo, colocando pares de archivo FileKey -> en un Multimap)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top