如标题所述,我没有包裹名称或信息。我有一个 IProject 句柄和一个表示 IFile 名称的字符串。
IFile 是一个.java
类文件,而 IProject 是一个 Java 项目。理想情况下,我想在不假设它们是 Java 文件/项目的情况下这样做——但对于我的目的来说,假设是可以的。有什么建议么?
如标题所述,我没有包裹名称或信息。我有一个 IProject 句柄和一个表示 IFile 名称的字符串。
IFile 是一个.java
类文件,而 IProject 是一个 Java 项目。理想情况下,我想在不假设它们是 Java 文件/项目的情况下这样做——但对于我的目的来说,假设是可以的。有什么建议么?
如果要递归地从 IProject 获取文件,可以使用 IProject#members。
public IFile findFileRecursively(IContainer container, String name) throws CoreException {
for (IResource r : container.members()) {
if (r instanceof IContainer) {
IFile file = findFileRecursively((IContainer) r, name);
if(file != null) {
return file;
}
} else if (r instanceof IFile && r.getName().equals(name)) {
return (IFile) r;
}
}
return null;
}
您可以按如下方式调用该方法。
IFile file = findFileRecursively(project, "Foo.java");
如果您不想递归地查找文件,可以使用 IProject#findMembers(String)。
IResource#accept(IResourceProxyVisitor)
如果您要坚持使用资源,则应该使用它——这是浏览资源树的最轻量级的方式。您的访问者将能够询问IResourceProxy
项目中每个资源的给定实例其类型和名称,然后当它与代理匹配时请求完整路径,该代理既是文件又具有正确的名称。
如果你愿意通过 JDT API,它的SearchEngine就是为这种事情而构建的,它有专门查找类型名称的方法。在实现类中设置一些断点并尝试从运行时工作台的 UI 中执行一些 Java 搜索,以更好地了解它的设置方式。