java - 使用 Java 通过 inode 查找文件

标签 java linux file inode

我正在开发处理文件的软件,我需要能够找到一个文件,无论它是否已被移动、重命名等。是否有某种方法可以通过 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/

相关文章:

java - 持久性、oracle Thin、ORA-12505、TNS 监听器当前不知道 SID

java - 如何返回到 XPath 中的直接父级并获取文本?

linux - sort -um 是否仍然保证唯一性?

linux - 如何在不使用 shell 脚本中的管道或重定向的情况下将字符串附加到文件的开头或结尾?

file - 如何在 Informix 中打开和读取文件

java - 模拟 mvc 期望异常

java - 触发 @Before 建议的字段上的 AspectJ 注释

linux - 将可执行文件移动到 $PATH 中的另一个文件夹后找不到可执行文件

java - 如何一次读取文件 x 个字节?在java中

c - 如何在C中将文件中每一行的首字母设为大写