如何在不使用编辑器的情况下以编程方式在 Eclipse 中保存文件?
How to save files programmatically in Eclipse without using an editor?
我正在开发一个 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)
但是 none 这些解决方案有效。
因此我的问题是:
如何在不使用编辑器的情况下在 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);
}
在此执行结束时,我希望文件的新版本保存在磁盘上。如果我在编辑器中打开文件,该函数被正确删除并且修改出现在 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);
}
然而,这会为每个文件打开一个编辑器页面并立即关闭它,因此对于大量文件而言,性能并不令人满意。
听起来问题可能出在您的操作正在修改文件的工作副本,而不是底层文件本身。
可以通过调用 IWorkingCopy.commit()
.
将对工作副本的更改同步到基础文件
以下有帮助吗?
...
functionToDelete.delete(forceDeletion, progressMonitor);
ITranslationUnit tu = functionToDelete.getTranslationUnit();
if (tu.isWorkingCopy()) {
boolean forceCommit = true;
((IWorkingCopy) tu).commit(forceCommit, progressMonitor);
}
我正在开发一个 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)
但是 none 这些解决方案有效。 因此我的问题是:
如何在不使用编辑器的情况下在 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);
}
在此执行结束时,我希望文件的新版本保存在磁盘上。如果我在编辑器中打开文件,该函数被正确删除并且修改出现在 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);
}
然而,这会为每个文件打开一个编辑器页面并立即关闭它,因此对于大量文件而言,性能并不令人满意。
听起来问题可能出在您的操作正在修改文件的工作副本,而不是底层文件本身。
可以通过调用 IWorkingCopy.commit()
.
以下有帮助吗?
...
functionToDelete.delete(forceDeletion, progressMonitor);
ITranslationUnit tu = functionToDelete.getTranslationUnit();
if (tu.isWorkingCopy()) {
boolean forceCommit = true;
((IWorkingCopy) tu).commit(forceCommit, progressMonitor);
}