有没有办法将数据与文件夹层次结构中的文件相关联?

Is there a way to associate data with a file in a folder hierarchy?

我正在使用 Java 创建一个程序,该程序为文件夹结构编制索引并允许用户搜索文件并使用关键字标记文件,然后根据这些标记搜索文件。

目前我一直在使用 FileUtils listFiles 方法遍历文件夹层次结构,这基本上是这个问题:Recursively list files in Java

我还没有开始编写标记功能的代码,但提前考虑,我担心如果在我将文件与标签相关联后重命名或移动文件,那么它会丢失标签。这违背了我的程序的目的,因此任何人都可以提供关于如何存储位于文件夹层次结构中的每个文件或关联标签的建议,以便在重命名或移动文件时它仍然具有与之关联的标签。

如果 OS 不支持文件标记,您可以:

  1. 维护文件路径到标签的映射
  2. 维护文件哈希到标签的映射

使用选项 #2,即使文件被移动,您的标签也会被保留。但是如果有人移动并修改了文件,那么标签就会丢失。

我认为如果不更新与新创建文件的标记关系就无法做到这一点,因为 rename/mv 操作是在磁盘级别进行的,并且实际上有一个删除和 'create' 文件在后台发生复合动作。因此,甚至无法保证文件会位于磁盘上的同一位置。如果您确定该文件将具有相同的内容,您可以在 String 对象中获取文件内容的 MD5 签名,然后在查询标签时始终比较它们,当然,当文件的内容变化。

最好的办法是使用带有文件路径和标签的散列映射,然后在文件名更改时使用目录观察器更新散列映射。这是我能想到的最好的!

如果你想跟踪一个文件,即使它的名字 and/or 位置发生变化,你应该使用它的唯一标识符,在大多数文件系统中它被称为它的 inode. (I think NTFS/Windows calls it a "file ID.") You can read a file's inode using its BasicFileAttributes.fileKey:

Object key = Files.getAttribute(file.toPath(), "fileKey");

该键适合用作 HashMap 键。