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

Eclipse PDE: Get full path of an external file open in Workbench

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

我能够获取属于任何 Eclipse 项目的任何文件的完整路径。从工作区获取 open/active 编辑器文件的代码。

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 从文件 -> 打开文件打开了一个文件。我的插件无法找到此文件的位置。

经过几天的搜索,我通过查看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);
    }

我修改了问题中发布的代码以处理工作区中的文件和外部文件。

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;
    }