【问题标题】:How to detect if a file has been renamed?如何检测文件是否已重命名?
【发布时间】:2019-02-15 06:09:03
【问题描述】:

我目前正在 Java 中实现我自己版本的 WatchService API

(你可以参考这个example来了解WatchService文件是做什么的。)

我为以下情况实现了代码

  • 每当在目录或其子目录中创建文件时。
  • 每当从目录或其子目录中删除文件时。
  • 每当目录或其子目录中的文件被修改时。 (基于文件最后修改日期的比较)

我遇到了一个问题,每当文件被重命名时,我不知道如何跟踪它。

此链接包含我的代码的高级要点:click here

每当重命名文件时,我都会得到 2 个结果

文件已删除: {旧文件名}
已添加文件: {新文件名}

但我想要的实际结果是:

文件重命名: FROM {old filename} TO {new filename}

我该如何应对这个挑战?

我提供了一个伪代码(我认为这足以理解手头的问题),如果需要我也可以提供整个代码:)

【问题讨论】:

  • 你如何存储这些文件?你有自己的 File 类实现吗?
  • @RafałSokalski 是的,我有自己的文件类,它存储各种数据,包括我的代码遍历文件时的创建日期和最后修改日期。
  • 由于您的特定监视服务将在其自己的线程中运行,我认为您需要维护文件索引。每当触发事件时,都需要将索引进行比较。如果存在相同数量的文件但一个名称不同但它包含相同的时间戳和一个不再存在的名称的校验和,则该文件被重命名。
  • 因此您可以存储您的实际文件名,如果您想更改它,然后在您自己的 File 类中使用旧名称更新变量,那么如果您的 if 语句返回该文件已更改,您可以简单地获取此名称

标签: java file detection file-rename


【解决方案1】:

您可以为每个文件存储哈希值。 当您检测到某些文件被删除并添加了一些比较哈希值时,如果它们匹配,您会发现重命名/移动的文件。

【讨论】:

  • 哈希值会随着内容的修改而改变。
  • @talex 你能详细说明一下,这个哈希应该在什么基础上计算?我无法完全理解你的想法。因为如果文件被重命名/修改/移动,我猜同一个文件的哈希值可能会改变。
  • @HariKrishna 每次更改内容时都必须更新哈希。会很慢的。
  • @MihirMehta 内容哈希。文件重命名时内容保持不变。
【解决方案2】:

每当重命名文件时,观察服务都会生成删除 + 创建事件。您应该了解如何将这两个事件合并为重命名事件。

您可以创建一个唯一的 ID 并将其分配给文件。请参阅此link。每当您在文件上看到创建事件并且它已经有一些 id 时,这意味着它被重命名,否则它是新创建的。对于新创建的文件,您应该设置随机唯一 ID 以跟踪重命名事件。

【讨论】:

    【解决方案3】:

    JNotify 支持JNotify.FILE_RENAMED 事件。据我了解,这是原生 inotify API 的包装器,它可以在系统级别捕获文件重命名(更改名称而不更改文件描述符)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 2015-01-21
      • 2011-10-28
      • 2012-04-18
      • 1970-01-01
      • 2021-11-28
      相关资源
      最近更新 更多