【问题标题】:Java7 / Path / File / get a unique ID like an Inode of a fileJava7 / 路径 / 文件 / 获取一个唯一 ID,如文件的 Inode
【发布时间】:2011-11-21 15:57:10
【问题描述】:

如何从PathFile 实例中获取唯一ID,这些实例在“非Linux/Unix”文件系统中必须具有Inode 或另一个唯一ID?在 API 中找不到任何东西,我必须使用 JNI 吗?

编辑:我有两个原因:

  • 我希望有一个从文件系统中的文件到数据库系统中基于树的表示的唯一映射。
  • 我想检测文件的重命名,这会在通过WatchService 观看Path 时导致删除事件和新的插入事件(至少对于Linux/Unix 文件系统)。因此我无法使用Path 来检测此类重命名。

顺便说一句:起初我认为WatchService 会在重命名的情况下触发java.nio.file.StandardWatchEventKinds.ENTRY_MODIFY 事件,但我认为这取决于文件系统和/或仅在文件内容本身发生变化时才会发生。

所以我想我真的必须使用 JNI 绑定来检测重命名和移动?

编辑:我想我终于找到了如何获得唯一的文件表示:http://download.oracle.com/javase/7/docs/api/java/nio/file/attribute/BasicFileAttributes.html#fileKey()

【问题讨论】:

  • 不能使用文件的完整路径吗?那应该是独一无二的。或者也许将路径的字符转换为十六进制表示......
  • 你想用这个做什么?您是否只想保证唯一性?或者您是否需要操作系统的实际实际 inode 编号?如果是后者,为什么?
  • Files.getFileStore(file.toPath).getAttribute("unix:inod").

标签: java java-7


【解决方案1】:

如果你想要的只是一个唯一的 id,你可以散列文件路径(使用 sha1),它会给你一个唯一的文本 id

如果您想要与文件关联的真实 ID,则需要使用 JNI 并为每个操作系统提供自定义库。

【讨论】:

  • 哈希(根据定义)不是唯一的,因此将它们用作标识符并不是一个好主意。
  • 好吧,至少 git 使用了强大的散列算法,散列长度适中,因此发生冲突的可能性并不大。但是例如,永远不应该使用 hashCode() 的结果作为 id。 32 位太短了,而且该方法的大多数实现都使用非常弱的“算法”。
  • 不!由于许多原因,这不是真的。两个文本不同的路径可以与同一个文件相关联——考虑一个包含符号链接的路径和一个包含硬链接的情况。
【解决方案2】:

UNC 路径将是唯一键:“//SERVER/PATH/PATH/FILENAME”, 带有额外的 File.getCanonicalPath()。至少在 Windows 下,而不是驱动器号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    • 2017-03-11
    • 1970-01-01
    • 1970-01-01
    • 2015-05-31
    相关资源
    最近更新 更多