2014-11-05 38 views
0

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

我能想到的是通过检查创建日期==修改日期。事实上,我将删除旧文件并在用户尚未触及文件之前再次创建它,以确保创建日期始终等于修改日期。但是我没有看到如何从IFile中检索这两个属性。任何人都可以帮我解释这一点?

我是Eclipse插件开发的新手,任何人都可以提出另一种解决方法吗?那些是源代码

回答

1

一个IFile的修改邮票或更一般的IResource可以与getModificationStamp()获得

***生成的文件不能被锁定。返回值不是严格的时间戳,但应满足您的需求,详情请参见JavaDoc

但是,如果您想跟踪文件内容是否发生更改,我宁愿计算内容的散列,例如MessageDigest。然后您可以比较这两个哈希来决定文件是否已更改。

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

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

+0

嗨@吕迪格,您的建议感谢。消息摘要不起作用,因为内容不同,因为每当用户修改它们时都会有一些参数更改。所以即使文件内容没有改变,比较也会失败,因为生成的内容可能不同。 但是,我不明白修改邮票将如何帮助在这种情况下?我如何知道这些文件是否被修改而没有与创建图章进行比较? – 2014-11-07 02:02:10

+0

@SengZhe请看我修正的答案。 – 2014-11-07 10:39:48

+0

感谢您的建议!我不知道IResource的setPersistentProperty方法。真正有用的知识。我的下一个实现将使用哈希内容解决方案。现在,filestate解决了我的问题,但感谢提示! – 2014-11-11 02:01:57

0

我找到了答案:

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

此功能是通过Eclipse IDE中保持这样它才能生存,月食的重新启动。如果文件未经修改而创建,则历史状态为零。

您可以通过执行清除当地的历史:

existingFile.clearHistory(NullProgessMonitor); 
+0

本地资源历史记录不是为了追踪资源变化。它意味着在用户控制之下,指定是否保存资源的历史记录以及保存多久。而且,清除历史将破坏“比较历史”等特征。 – 2014-11-07 10:48:05

相关问题