Eclipse PDE:获取在Workbench中打开的外部文件的完整路径

时间:2016-09-23 12:38:20

标签: pde

我正在编写一个Eclipse插件,它要求我获取工作区中打开的任何类型文件的完整路径。

我能够获得任何Eclipse项目中任何文件的完整路径。用于从工作空间获取打开/活动编辑器文件的代码。

public static String getActiveFilename(IWorkbenchWindow window) {
        IWorkbenchPage activePage = window.getActivePage();
        IEditorInput input = activePage.getActiveEditor().getEditorInput();
        String name = activePage.getActiveEditor().getEditorInput().getName();
        PluginUtils.log(activePage.getActiveEditor().getClass() +" Editor.");
        IPath path = input instanceof FileEditorInput ? ((FileEditorInput) input).getPath() : null;
        if (path != null) {
            return path.toPortableString();
        }
        return name;
    }

但是,如果任何文件为drag-dropped in Workspace或使用File -> Open File打开。例如,我从文件中打开了来自/Users/mac/log.txt的文件 - >打开文件。我的插件无法找到此文件的位置。

1 个答案:

答案 0 :(得分:0)

经过几天的搜索,我通过查看Eclipse IDE的源代码找到了答案。

在IDE.class中,Eclipse会根据工作区文件或外部文件尝试查找合适的编辑器输入。 Eclipse使用FileEditorInput处理工作区中的文件,使用FileStoreEditorInput处理外部文件。以下代码段:

/**
     * Create the Editor Input appropriate for the given <code>IFileStore</code>.
     * The result is a normal file editor input if the file exists in the
     * workspace and, if not, we create a wrapper capable of managing an
     * 'external' file using its <code>IFileStore</code>.
     *
     * @param fileStore
     *            The file store to provide the editor input for
     * @return The editor input associated with the given file store
     * @since 3.3
     */
    private static IEditorInput getEditorInput(IFileStore fileStore) {
        IFile workspaceFile = getWorkspaceFile(fileStore);
        if (workspaceFile != null)
            return new FileEditorInput(workspaceFile);
        return new FileStoreEditorInput(fileStore);
    }

我修改了问题中发布的代码,以处理Workspace和外部文件中的两个文件。

public static String getActiveEditorFilepath(IWorkbenchWindow window) {
        IWorkbenchPage activePage = window.getActivePage();
        IEditorInput input = activePage.getActiveEditor().getEditorInput();


        String name = activePage.getActiveEditor().getEditorInput().getName();
        //Path of files in the workspace.
        IPath path = input instanceof FileEditorInput ? ((FileEditorInput) input).getPath() : null;
        if (path != null) {
            return path.toPortableString();
        }

        //Path of the externally opened files in Editor context.
        try {
            URI urlPath = input instanceof FileStoreEditorInput ? ((FileStoreEditorInput) input).getURI() : null;
            if (urlPath != null) {
                return new File(urlPath.toURL().getPath()).getAbsolutePath();
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }

        //Fallback option to get at least name
        return name;
    }