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;
}
我正在编写一个 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;
}