Canonical获取活动文件代码抛出FileNotFoundexception

时间:2014-03-30 22:56:50

标签: eclipse eclipse-plugin

许多其他答案让我想到了这个精彩的片段,它宣称在Eclipse中获取当前活动的文件:

IWorkbenchPart workbenchPart = PlatformUI.getWorkbench()
    .getActiveWorkbenchWindow().getActivePage().getActivePart(); 
IFile file = (IFile) workbenchPart.getSite().getPage().getActiveEditor()
    .getEditorInput().getAdapter(IFile.class);
if (file == null) throw new FileNotFoundException();

我完全相信它可以根据这些问题的结果工作,但是,它总是会为我抛出一个FileNotFoundException。

这怎么可能?有没有其他方法来获取活动文件?

注意:org.eclipse.core.resourcesorg.eclipse.core.runtime都在我的依赖列表中,因此IAdaptable应该可以正常工作。这是另一个问题。

1 个答案:

答案 0 :(得分:1)

编辑器的输入不必支持适应IFile。输入通常会实现IFileEditorInputIPathEditorInputIURIEditorInputILocationProvider中的一个或多个。

如果可能,此代码会找到IFileIPath

/**
 * Get a file from the editor input if possible.
 *
 * @param input The editor input
 * @return The file or <code>null</code>
 */
public static IFile getFileFromEditorInput(final IEditorInput input)
{
  if (input == null)
    return null;

  if (input instanceof IFileEditorInput)
    return ((IFileEditorInput)input).getFile();

  final IPath path = getPathFromEditorInput(input);
  if (path == null)
    return null;

  return ResourcesPlugin.getWorkspace().getRoot().getFile(path);
}


/**
 * Get the file path from the editor input.
 *
 * @param input The editor input
 * @return The path or <code>null</code>
 */
public static IPath getPathFromEditorInput(final IEditorInput input)
{
  if (input instanceof ILocationProvider)
    return ((ILocationProvider)input).getPath(input);

  if (input instanceof IURIEditorInput)
   {
     final URI uri = ((IURIEditorInput)input).getURI();
     if (uri != null)
      {
        final IPath path = URIUtil.toPath(uri);
        if (path != null)
          return path;
      }
   }

  if (input instanceof IFileEditorInput)
   {
     final IFile file = ((IFileEditorInput)input).getFile();
     if (file != null)
       return file.getLocation();
   }

  return null;
}