2

如标题所述,我没有包裹名称或信息。我有一个 IProject 句柄和一个表示 IFile 名称的字符串。

IFile 是一个.java类文件,而 IProject 是一个 Java 项目。理想情况下,我想在不假设它们是 Java 文件/项目的情况下这样做——但对于我的目的来说,假设是可以的。有什么建议么?

4

2 回答 2

6

如果要递归地从 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)。

于 2014-02-26T04:38:54.147 回答
2

IResource#accept(IResourceProxyVisitor)如果您要坚持使用资源,则应该使用它——这是浏览资源树的最轻量级的方式。您的访问者将能够询问IResourceProxy项目中每个资源的给定实例其类型和名称,然后当它与代理匹配时请求完整路径,该代理既是文件又具有正确的名称。

如果你愿意通过 JDT API,它的SearchEngine就是为这种事情而构建的,它有专门查找类型名称的方法。在实现类中设置一些断点并尝试从运行时工作台的 UI 中执行一些 Java 搜索,以更好地了解它的设置方式。

于 2014-02-26T04:58:35.293 回答