我在Linux上,而我的Java应用程序并非旨在可移植。
我正在寻找一种用Java唯一标识文件的方法。我可以使用statfs
系统调用,因为这对(f_fsid, ino)
唯一标识一个文件(不仅在整个文件系统中),而且在此处指定:http://man7.org/linux/man-pages/man2/statfs.2.html
问题是,是否可以直接从Java中提取fsid
,以便避免编写JNI函数?
inode
可以用NIO
提取,但是fsid呢? inode和fsid来自不同的结构,并由不同的系统调用操作...
答案 0 :(得分:3)
这个Java示例演示了如何获取文件的unix索引节点号。
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);
}
}
输出
$ java MyFile
Inode: 664938
$ ls -i MyFile.java
664938 MyFile.java
答案 1 :(得分:2)
我建议使用散列文件内容的GIT方法。这是防止复制和重命名的证据。
Java应该是独立于平台的,因此使用Unix特定方法可能不是您想要的。