【问题标题】:How to check generated file has been modified in Eclipse plugin development?如何检查生成的文件在 Eclipse 插件开发中是否被修改?
【发布时间】:2014-11-05 02:16:16
【问题描述】:

目前插件会在一个IProject中生成一系列文件,我需要检查生成的文件是否被用户修改过。如果生成的工件已被用户修改,我将需要以不同的方式处理重新生成。

我能想到的是通过检查 Creation Date == Modified Date 。我将删除旧文件并在用户之前未触摸该文件时再次创建它以确保创建日期始终等于修改日期这一事实。但是我没有看到如何从 IFile 中检索这两个属性。有人可以帮我解决这个问题吗?

我是 Eclipse 插件开发的新手,谁能提出另一种解决方法?

*** 生成的文件是源代码,无法锁定

【问题讨论】:

    标签: eclipse eclipse-plugin generated-code


    【解决方案1】:

    IFile 或更一般的IResource 的修改标记可以通过getModificationStamp() 获得。返回值不是严格意义上的时间戳,但应该可以满足您的需求,请参阅JavaDoc 了解详细信息。

    但是,如果您想跟踪文件的内容是否已更改,我宁愿计算内容的哈希值,例如使用 MessageDigest。然后,您可以比较两个哈希值以确定文件是否已更改。

    如果文件被更改 - 保存 - 更改恢复 - 再次保存,后一种方法会将文件视为未更改。另一方面,修改标记会声明文件已更改,即使其内容再次相同。

    无论您选择哪种方法,您都可以使用IResource#setPersistentProperty() 在生成时存储修改戳(或内容哈希),然后将其与当前修改戳进行比较。持久属性与平台元数据一起存储在磁盘上,并在平台关闭和重新启动时维护。

    【讨论】:

    • 嗨@Rüdiger,感谢您的建议。消息摘要不起作用,因为内容会有所不同,因为每当用户修改它们时都会发生一些参数更改。所以即使文件内容没有改变,比较也会失败,因为生成的内容可能不同。但是,我不明白修改戳在这种情况下会有什么帮助?我如何知道文件是否被修改而不与创建标记进行比较?
    • @SengZhe 请看我修改后的答案。
    • 感谢您的建议!我不知道 IResource 的 setPersistentProperty 方法。真正有用的知识。我的下一个实施将使用散列内容解决方案。目前,文件状态解决了我的问题,但感谢您的提示!
    【解决方案2】:

    我找到了答案:

    private boolean isModified(IFile existingFile) throws CoreException {
      IFileState[] history = existingFile.getHistory(NullProgessMonitor);
      return history.length > 0;
    }
    

    此功能由 eclipse IDE 维护,因此它可以在 eclipse 重新启动后继续存在。如果文件是在没有修改的情况下创建的,则历史状态为零。

    您可以通过以下方式清除本地历史记录:

    existingFile.clearHistory(NullProgessMonitor);
    

    【讨论】:

    • 本地资源历史记录并不意味着跟踪资源更改。它意味着在用户控制之下,谁来指定是否保留资源的历史记录以及保留多长时间。此外,清除历史记录会破坏某些功能,例如“与历史记录比较”等。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-10
    • 2021-04-17
    • 1970-01-01
    • 1970-01-01
    • 2012-03-18
    • 2018-04-02
    • 1970-01-01
    相关资源
    最近更新 更多