2017-07-24 74 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

相關問題