【问题标题】:Eclipse API: Get IFile or fully-qualified name from IJavaProject using only the file's name stringEclipse API:仅使用文件的名称字符串从 IJavaProject 获取 IFile 或完全限定名称
【发布时间】:2014-03-11 21:08:15
【问题描述】:

仅给定 .java 文件的名称(字符串)和对其IJavaProject 的访问权限,我如何才能找到文件的 IFile 或完全限定路径?例如,如果文件名是Foo.java,我有字符串Foo

这是我的尝试,但是太慢了:

// Find the fully qualified path from "fileName".
for (ICompilationUnit unit : JDTUtility.getCompilationUnits(javaProject))
{
    if (unit.getElementName().equals(fileName))
        file = (IFile) unit.getResource();
}

// Get a list of ICompilationUnits from an IJavaProject object 
public static List<ICompilationUnit> getCompilationUnits(IJavaProject javaProject)
{
    ArrayList<ICompilationUnit> units = new ArrayList<>();
    try
    {
        IPackageFragmentRoot[] packageFragmentRoots = javaProject.getAllPackageFragmentRoots();
        for (int i = 0; i < packageFragmentRoots.length; i++)
        {
            IPackageFragmentRoot packageFragmentRoot = packageFragmentRoots[i];
            IJavaElement[] fragments = packageFragmentRoot.getChildren();
            for (int j = 0; j < fragments.length; j++)
            {
                IPackageFragment fragment = (IPackageFragment) fragments[j];
                IJavaElement[] javaElements = fragment.getChildren();
                for (int k = 0; k < javaElements.length; k++)
                {
                    IJavaElement javaElement = javaElements[k];
                    if (javaElement.getElementType() == IJavaElement.COMPILATION_UNIT)
                    {
                        units.add((ICompilationUnit) javaElement);
                    }
                }
            }
        }
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
    return units;
}

【问题讨论】:

  • 字符串名称是什么意思 - 只是 xxx.java 还是您有完整的包名(或路径)?
  • 在一个项目中可能有很多名为Foo.java 的文件位于不同的包中,那么您如何确定是哪一个?
  • 我相信每个源文件夹 (IPackageFragmentRoot) 中只有一个唯一的 Foo.java,因此我可能需要遍历 IJavaProject 中的每个源文件夹或返回所有匹配的实例。

标签: java eclipse eclipse-plugin


【解决方案1】:

您可以使用getProject() 方法从IJavaProject 获取IProject

IProject project = javaProject.getProject();

扫描项目最快的方法是accept(IResourceProxyVisitor)方法:

project.accept(new IResourceProxyVisitor()
  {
    @Override
    public boolean visit(IResourceProxy proxy) throws CoreException
    {
       if ("Foo.java").equals(proxy.getName))
        {
          IPath workspacePath = proxy.requestFullPath();
          // TODO deal with path
          // Alternative
          IResource resource = proxy.requestResource();
        }
    }
  });

【讨论】:

    猜你喜欢
    • 2015-05-17
    • 2014-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多