2017-07-24 31 views
1

我正在开发一个Eclipse插件,它以编程方式修改工作区中的C++文件。我现在试图保存所做的更改。我看了一下这个解决方案:How can I call save method in eclipse plugin development programmatically,但这包括让我想要在编辑器中保存的文件打开。由于我有 5k +文件来修改和保存,我不能在保存之前在编辑器中打开它们。如何在不使用编辑器的情况下以编程方式在Eclipse中保存文件?

在寻找解决方案时,我在官方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) 

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

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

感谢很多提前

编辑:什么我想要实现

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

在此执行结束

例子,我希望新版本要保存在磁盘上的文件。如果我在编辑器中打开该文件,但该文件被Eclipse标记为未保存(在文件名称前面显示一个星号),该功能将被正确删除,修改将显示在IDE中。

编辑:

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

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

然而,这将打开每个文件并关闭编辑页面它立即,所以性能不满足大量的文件。

+0

需要更多信息。如果你没有在编辑器中打开文件,你想保存什么文件,以及你如何加载文件?即您试图保存的编辑存储在哪里。 –

+0

*不回答你的问题*使用org.eclipse.ui.ide.IDE。saveAllEditors(IResource [],布尔值)可能是保存编辑器的最佳方式。 –

+0

插件通过'ISourceManipulation.delete'删除一些特定的代码部分。该插件通过Eclipse索引('IIndex')解析给定项目中的所有文件,并删除相关代码,所有这些都发生在后台。因此,某些代码已被删除的文件与磁盘不同步,但它们在编辑器中未打开。 – AGenevray

回答

1

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

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

以下有帮助吗?

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

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

它的工作!我知道我正在修改一个工作副本,但我认为它是在删除后的某个时间点由eclipse框架提交的。我的不好,非常感谢! – AGenevray

相关问题