使用CDT从现有的eclipse项目中获取源文件列表

时间:2012-09-14 09:33:46

标签: eclipse-cdt

我正在开发CDT eclipse插件,我正在尝试使用以下代码使用CDT代码获取eclipse项目资源管理器中存在的源文件列表,结果为null。

情况1:

IFile[] files2 = ResourcesPlugin.getWorkspace().getRoot().findFilesForLocationURI(new URI("file:/"+workingDirectory));
for (IFile file : files2) {
   System.out.println("fullpath " +file.getFullPath());
}

案例2:

IFile[] files = ResourcesPlugin.getWorkspace().getRoot().findFilesForLocationURI(getProject().getRawLocationURI());
for (IFile file : files) {
   System.out.println("fullpath " +file.getFullPath());              
}

情形3:

IFile[] files3 = ResourceLookup.findFilesByName(getProject().getFullPath(),ResourcesPlugin.getWorkspace().getRoot().getProjects(),false);
for (IFile file : files3) {
   System.out.println("fullpath " +file.getFullPath());
}

CASE4:

IFolder srcFolder = project.getFolder("src");

案例1,2,3给我输出null,我期待文件列表; 在案例4:我得到“helloworld / src”文件列表,但我希望从现有项目中获取文件意味着主根,例如:“helloworld” 请建议我。

1 个答案:

答案 0 :(得分:4)

您可以使用IResourceVisitor遍历worspace资源树 - 或者您可以浏览CDT模型:

private void findSourceFiles(final IProject project) {
    final ICProject cproject = CoreModel.getDefault().create(project);
    if (cproject != null) {
        try {
            cproject.accept(new ICElementVisitor() {

                @Override
                public boolean visit(final ICElement element) throws CoreException {
                    if (element.getElementType() == ICElement.C_UNIT) {
                        ITranslationUnit unit = (ITranslationUnit) element;
                        if (unit.isSourceUnit()) {
                            System.out.printf("%s, %s, %s\n", element.getElementName(), element.getClass(), element
                                    .getUnderlyingResource().getFullPath());
                        }
                        return false;
                    } else {
                        return true;
                    }
                }
            });
        } catch (final CoreException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

请注意,您可能需要更多源文件(例如,您可能不关心系统的标题) - 您可以通过检查底层资源来过滤它们。