我正在编写一个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的文件 - >打开文件。我的插件无法找到此文件的位置。
答案 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;
}