我正在开发处理文件的软件,我需要能够找到一个文件,无论它是否已被移动、重命名等。是否有某种方法可以通过 Java 搜索其 inode 来实现?
最佳答案
这有两个部分:为您已知的文件获取 inode ,然后找到具有该 inode 的文件。
有一种机制可以实现前者,但不能保证。
import java.nio.file.Files;
import java.io.IOException;
// ...
private static OptionalLong findInode(File file)
throws IOException /* , SecurityException */ {
try {
Long inode = Files.getAttribute(file.toPath(), "unix:ino");
return inode != null ? OptionalLong.of(inode) : OptionalLong.empty();
}
catch (UnsupportedOperationException | IllegalArgumentException e) {
// getting an inode is unsupported for this JVM or that filesystem
return OptionalLong.empty();
}
}
至于稍后根据该 inode 找到文件,那是不可能的。 native 文件系统 API 可能会或可能不会提供一种快速的方法来首先做到这一点,我不知道。我怀疑不是,这就是为什么一般的命令行解决方案使用 find
命令。
这就是您进入该方法的一些特别脆弱的方面的地方。正如 Zaboj Campula 提到的,您不能保证“移动”或“重命名”操作是以保留原始 inode 的方式执行的。
如果是,理论上您可以通过递归原始路径的 FileSystem
并使用上述方法检查每个文件的 inode,从而在 Java 中重现 find
的功能。但即使这样做,您也不能保证能够递归地找到它们。例如,文件可能已移至您无权访问的目录中。您还必须准备好多个路径可能共享相同 inode。由于这个问题是基于文件在后台四处移动的可能性,所以在您的递归下降期间,总是有可能发生这种情况,并将其移动到您已经搜索过的地方.
因此,只要您做好准备,这不是一个 100% 可靠的过程,上述内容可能会让您到达目的地。
关于java - 使用 Java 通过 inode 查找文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46474792/