Repository navigation
fix(workspace): 优化文件操作内存并显示进度 - #93
Open
3316891527 wants to merge 2 commits into
Open
3316891527 wants to merge 2 commits into
3316891527 wants to merge 2 commits into
Conversation
This was referenced Oct 30, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
变更说明 / Description
工作区将本机 Ubuntu 项目目录粘贴到手机存储时,原跨环境复制会完整保存文件字符串或字节数组,放大内存占用;复制、移动和删除期间只有旋转圆环,无法判断当前操作。
本 PR 使用复用 256 KiB 缓冲区的二进制流式复制,并为复制、移动、单项删除和批量删除增加主题化进度窗口。复制显示实际字节进度;删除显示当前路径和所选项目完成数。目录复制失败向上传播,跨环境剪切只有在整项复制成功后才删除来源。
背景与动机 / Context and motivation
实际反馈中,将
/root/Operit从本机 Linux 复制到手机目录,约几十 MiB 时发生 OOM。原实现从 Linux 读取完整文本再转成字节,反向使用ByteArrayOutputStream累积整个文件,分块读取仍保留完整内容。目录子项失败也可能被忽略,影响剪切收尾的成功判定。文件操作窗口同时需要覆盖删除:单个目录的后端没有内部进度数据,批量删除则已有明确的所选项目顺序,界面应分别显示处理中状态和真实项目进度。
改动范围 / Changes
本机复制改为固定缓冲的流式传输,复制与移动显示字节进度;单项和批量删除共用窗口样式,并按所选项目报告完成数。
实现位置与回归范围
core/files/transfer/StreamingFileCopy.kt先统计目录,再逐层复制,整个任务复用 256 KiB 缓冲区,不缓存整棵目录清单,也不将二进制内容转换为文本。本机 Linux 与手机之间复制大文件时,不再因完整字符串和字节数组副本放大内存占用。LocalTransferPaths.kt复用终端的 PRoot 挂载映射,处理~、/sdcard及宿主目录;复制前按实际路径拒绝自身及自身子目录,顶层目标原子创建,避免别名导致递归复制或统计期间的同名目标被合并写入。StandardFileSystemTools.kt将本机 Linux 及携带工作区观察者的标准 Android 复制接入流式实现,子项失败立即向上传播;WorkspaceBrowserOperations.kt保留目标预检及逐项成功后删除剪切来源的规则,避免部分复制被误判为完整成功。browser/transfer/WorkspaceFileOperationDialog.kt统一复制、移动和删除的窗口外观,标题居中,6dp 进度条右上方显示可用的真实百分比,跟随主题并支持取消和内容滚动。复制与移动仍显示当前文件、来源、目标、已复制量、剩余量和速度,复制进度更新最多约每 200ms 一次。WorkspaceDeleteProgress.kt、WorkspaceDeleteProgressDialog.kt及FileManager.kt将单项、批量删除接入进度窗口。删除显示当前名称、来源路径和“已删除 X / Y 项”;单项目录执行期间使用不确定进度,批量比例只在现有删除工具返回成功后推进,避免让单个目录内部的未知进度看起来已完成。失败停止后续项,结束时清理窗口状态。WorkspaceBrowserOperations.kt的删除入口继续使用原delete_file、环境和递归参数,保留单项及批量确认。批量成功项更新选择;跨环境剪切的来源清理使用内部删除入口,保持在移动窗口中,避免叠加第二个删除窗口。strings_workspace_transfer.xml补齐 9 组语言资源,每组 19 个条目。新增 17 条 JVM 回归用例,其中 10 条覆盖流式复制,7 条覆盖删除进度、部分失败、取消、空列表及任务状态重置;这些用例已编写,执行结果待 CI。兼容性与风险 / Compatibility and risks
公开文件工具参数、既有权限分级、删除后端与确认提示保持兼容。远程 SSH、SAF 和独立 Shell 复制沿用原后端;没有真实字节数据时只显示当前项目和处理中状态,不显示推算百分比。
删除进度按所选顶层项目计数,不代表目录内文件数或字节数。取消会在当前删除调用返回后停止后续项目;已经删除的内容不恢复。窗口内说明这一行为。本机流式复制在缓冲块之间检查取消,其他原有后端在当前调用返回后停止后续处理。
目录复制增加一次统计遍历,统计阶段明确显示正在统计。符号链接复制链接本身,不遍历目标;不支持符号链接的目标存储会明确失败并保留来源。复制失败时已写入的部分目标保留,不自动删除其他文件。复制期间持续变化的目录不具备快照语义。
关联 Issue / Related issue
N/A:来自实际工作区复制 OOM、进度反馈缺失和删除窗口补齐的直接反馈,未另建 Issue。
验证方式 / Verification
完整验证范围包含此前的全部复制用例、7 条删除状态用例和对应的实机操作项;结果表可填写实际结果。PR Check 按现有 PR 配置运行,不将派发受理视为编译或测试通过。
证据 / Evidence
检查清单 / Checklist