Uniquely identify file in Java

南笙酒味 提交于 2021-01-26 11:01:13

问题


Im on Linux and my Java application is not intended to be portable.

I'm looking for a way to identify a file uniquely in Java. I can make use of statfs syscall since the pair (f_fsid, ino) uniquely identifies a file (not only across a file system) as specified here: http://man7.org/linux/man-pages/man2/statfs.2.html

The question is if it is possible extract fsid from Java directly so I can avoid writing JNI function?

inode can be extracted with NIO, but how about fsid? inode and fsid comes from different structure and are operated by different syscalls...


回答1:


This java example demonstrates how to get the unix inode number of a file.

import java.nio.file.*;
import java.nio.file.attribute.*;

public class MyFile {

  public static void main(String[] args) throws Exception  {

    BasicFileAttributes attr = null;
    Path path = Paths.get("MyFile.java");

    attr = Files.readAttributes(path, BasicFileAttributes.class);

    Object fileKey = attr.fileKey();
    String s = fileKey.toString();
    String inode = s.substring(s.indexOf("ino=") + 4, s.indexOf(")"));
    System.out.println("Inode: " + inode);
  }
}

The output

$ java MyFile
Inode: 664938

$ ls -i MyFile.java 
664938 MyFile.java

credit where credit is due: https://www.javacodex.com/More-Examples/1/8




回答2:


I would suggest the GIT method of hashing the file contents. This is proof against copying and renaming.

Java is supposed to be platform independent so using Unix specific methods may not be what you want.



来源:https://stackoverflow.com/questions/53935601/uniquely-identify-file-in-java

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!