如何在不使用编辑器的情况下以编程方式在Eclipse中保存文件?

时间:2017-07-24 13:52:23

标签: java eclipse eclipse-plugin eclipse-rcp eclipse-cdt

我正在开发一个Eclipse插件,它以编程方式修改工作区中的C ++文件。我现在正试图保存所做的更改。我已经看过这个解决方案:How can I call save method in eclipse plugin development programmatically但这包括在编辑器中保存要保存的文件。既然我有 要修改和保存的5k +文件,在保存之前我无法在编辑器中打开它们。

在寻找解决方案时,我在官方Eclipse论坛上找到了这个主题:https://www.eclipse.org/forums/index.php/t/1070377/。不幸的是,没有提供答案。

我尝试过使用:

PlatformUI.getWorkbench().getService(IHandlerService.class).executeCommand("org.eclipse.ui.file.saveAll", event)

IWorkspace.save(boolean, IProgressMonitor)

ITranslationUnit.save(IProgressMonitor, boolean)

ICProject.save(IProgressMonitor, boolean)

但这些解决方案都没有奏效。 因此,我的问题是:

如何在不使用编辑器的情况下以编程方式保存文件?

提前多多感谢

编辑:

我想要实现的例子

deleteAndSave(IFunction functionToDelete) {
    boolean forceDeletion = true;
    IProgressMonitor progressMonitor = new NullProgressMonitor();
    //delete the portion of code
    functionToDelete.delete(forceDeletion, progressMonitor);
    //we get the file containing the function
    IFile file = (IFile) functionToDelete.getUnderlyingResource();
    //save the file to the disk (ideally 'file.save()' ?)
    file.getWorkspace().save(true, progressMonitor);
}

在执行结束时,我希望将新版本的文件保存在磁盘上。如果我在编辑器中打开文件,该函数会被正确删除并且修改会显示在IDE中,但Eclipse会将文件标记为未保存(在文件名前显示一个星号)。

编辑:

虽然这不回答问题(不使用编辑器),但我得到了正确的行为:

deleteAndSave(IFunction functionToDelete) {
    IProgressMonitor progressMonitor = new NullProgressMonitor();
    IWorkbenchPage activePage = PlatformUI
        .getWorkbench()
        .getActiveWorkbenchWindow()
        .getActivePage();

    functionToDelete.delete(true, progressMonitor);

    IFile file = (IFile) functionToDelete.getUnderlyingResource();
    IEditorPart editorPart = IDE.openEditor(activePage, file);
    editorPart.doSave(progressMonitor);
    activePage.closeEditor(editorPart, false);
}

但是,这会打开每个文件的编辑器页面并立即关闭,因此对于大量文件而言,性能并不令人满意。

1 个答案:

答案 0 :(得分:1)

听起来问题可能是您的操作正在修改文件的工作副本,而不是基础文件本身。

通过调用IWorkingCopy.commit()可以将对工作副本的更改同步到基础文件。

以下是否有帮助?

...
functionToDelete.delete(forceDeletion, progressMonitor);

ITranslationUnit tu = functionToDelete.getTranslationUnit();
if (tu.isWorkingCopy()) {
    boolean forceCommit = true;
    ((IWorkingCopy) tu).commit(forceCommit, progressMonitor);
}