如何在Eclipse中检查项目内所有文件是否已保存?
检查Eclipse项目中所有未保存文件的实现方案
刚好我之前在Eclipse RCP项目里处理过类似的需求,给你分享下两种常用的实现思路,适配不同的场景:
场景1:检查项目中已打开且未保存的编辑器文件
这个是你单文件检查逻辑的扩展,核心是遍历工作区中所有打开的编辑器,筛选出属于目标项目且处于dirty状态的文件:
// 假设你已经获取到目标项目的IProject实例(可通过选择服务或其他方式获取) IWorkbenchPage activePage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); IEditorReference[] allEditorRefs = activePage.getEditorReferences(); List<IEditorPart> dirtyProjectEditors = new ArrayList<>(); for (IEditorReference editorRef : allEditorRefs) { // 不激活编辑器,避免干扰用户操作 IEditorPart editor = editorRef.getEditor(false); if (editor != null && editor.isDirty()) { IEditorInput editorInput = editor.getEditorInput(); // 只处理文件类型的编辑器输入 if (editorInput instanceof IFileEditorInput) { IFile editedFile = ((IFileEditorInput) editorInput).getFile(); // 判断文件是否属于目标项目 if (editedFile.getProject().equals(targetProject)) { dirtyProjectEditors.add(editor); } } } } if (!dirtyProjectEditors.isEmpty()) { MessageDialog.openInformation( PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "扫描提示", String.format("项目中有%d个文件未保存,请先保存后再执行扫描。", dirtyProjectEditors.size()) ); return false; }
场景2:检查项目中所有文件(含未打开的)的本地修改
如果你的场景需要覆盖未打开但本地已修改的文件(比如外部编辑器修改后未同步到Eclipse工作区),可以结合资源同步检查:
try { // 遍历项目下所有层级的文件资源 IResource[] allProjectResources = targetProject.members(IResource.DEPTH_INFINITE); boolean hasUnsavedLocalChanges = false; for (IResource resource : allProjectResources) { if (resource instanceof IFile) { IFile file = (IFile) resource; // 检查文件是否与工作区同步(本地修改未提交/保存) if (!file.isSynchronized(IResource.DEPTH_ZERO)) { hasUnsavedLocalChanges = true; break; } } } if (hasUnsavedLocalChanges) { MessageDialog.openInformation( PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "扫描提示", "项目中存在未同步的本地修改文件,请先同步或保存后再执行扫描。" ); return false; } } catch (CoreException e) { // 处理资源遍历异常,比如权限问题 e.printStackTrace(); MessageDialog.openError( PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "错误", "检查项目文件状态时发生异常:" + e.getMessage() ); return false; }
注意事项
- 如果你还没有获取目标项目的
IProject实例,可以通过Eclipse的选择服务(ISelectionService)获取用户选中的项目,或者根据项目名称从工作区查找:ResourcesPlugin.getWorkspace().getRoot().getProject("项目名")。 - 两种场景可以结合使用,确保覆盖所有未保存/未同步的情况。
内容的提问来源于stack exchange,提问作者Arathi Variar
相关产品推荐
相关产品推荐

