2017-07-24 2 views
1

Je développe un plug-in Eclipse qui modifie par programmation les fichiers C++ à partir de l'espace de travail. J'essaye maintenant de sauver les changements faits. J'ai jeté un coup d'oeil à cette solution: How can I call save method in eclipse plugin development programmatically mais cela inclut avoir les dossiers que je veux sauver ouvrent dans l'éditeur. Depuis que j'ai 5k + fichiers à modifier et enregistrer, je ne peux pas me permettre de les ouvrir tous dans un éditeur avant d'enregistrer.Comment enregistrer des fichiers par programme dans Eclipse sans utiliser d'éditeur?

En cherchant une solution j'ai trouvé ce sujet sur le forum officiel d'Eclipse: https://www.eclipse.org/forums/index.php/t/1070377/. Malheureusement, aucune réponse n'a été fournie.

J'ai essayé d'utiliser:

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

ou

IWorkspace.save(boolean, IProgressMonitor) 

ou

ITranslationUnit.save(IProgressMonitor, boolean) 

ou

ICProject.save(IProgressMonitor, boolean) 

mais aucune de ces solutions n'a fonctionné. Ma question est donc:

Comment enregistrer des fichiers par programme dans Eclipse sans utiliser un éditeur?

Merci beaucoup à l'avance

EDIT:

exemple de ce que je suis en train de réaliser

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

A la fin de cette exécution, j'attendre la nouvelle version de le fichier à enregistrer sur le disque. La fonction est correctement supprimée et les modifications apparaissent dans l'EDI si j'ouvre le fichier dans l'éditeur, mais le fichier est marqué comme non sauvegardé par Eclipse (montrant une étoile avant le nom du fichier).

EDIT:

Bien que cela ne répond pas à la question (sans utiliser un éditeur), je suis le bon comportement avec:

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

Cependant, cela ouvre une page de l'éditeur pour chaque fichier et ferme immédiatement, de sorte que les performances ne sont pas satisfaisantes pour un grand volume de fichiers.

+0

Plus d'infos nécessaire. Si vous n'avez pas ouvert le fichier dans un éditeur, qu'essayez-vous d'enregistrer et comment avez-vous chargé les fichiers? c'est-à-dire où sont les modifications que vous essayez d'enregistrer stockées. –

+0

* ne répondant pas à votre question * en utilisant org.eclipse.ui.ide.IDE.saveAllEditors (IResource [], boolean) est probablement le meilleur moyen de sauvegarder les éditeurs. –

+0

Le plugin supprime certaines parties spécifiques du code via 'ISourceManipulation.delete'. Le plugin analyse tous les fichiers d'un projet donné via l'index Eclipse ('IIndex') et supprime le code approprié, le tout en arrière-plan. Ainsi, les fichiers où du code a été supprimé ne sont pas synchronisés avec le disque, mais ils ne sont pas ouverts dans un éditeur. – AGenevray

Répondre

1

Il semble que le problème soit que votre opération modifie le copie de travail d'un fichier, et non le fichier sous-jacent lui-même.

Les modifications apportées à la copie de travail peuvent être synchronisées avec le fichier sous-jacent en appelant le IWorkingCopy.commit().

Est-ce que ce qui suit vous aide?

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

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

Ça a marché! Je savais que je modifiais une copie de travail, mais je pensais que le cadre d'Eclipse l'avait engagé à un moment donné après la suppression. Mon mal, merci beaucoup! – AGenevray