Skip to content

fix(workspace): 优化文件操作内存并显示进度 - #93

Open
3316891527 wants to merge 2 commits into
devfrom
fix/workspace-copy-streaming-progress
Open

3316891527 wants to merge 2 commits into
devfrom
fix/workspace-copy-streaming-progress

Conversation

@3316891527

@3316891527 3316891527 commented Oct 29, 2026 •

Copy link
Copy Markdown
Owner

变更说明 / 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

检查或命令:git diff --cached --check;XML 解析;资源名称、占位符与界面引用核对;单项/批量删除和剪切调用关系静态审阅
环境与变体:本地仅静态检查;远端 Build 使用 assembleDebug;Android Tests 使用 :app:testDebugUnitTest
结果:差异空白检查通过;9 组资源各 19 个条目、占位符一致、引用齐全;最新提交的 Build 和 Android Tests 均返回 HTTP 204 受理,最终结果待 CI
未运行项:未在本地编译、构建或执行测试;Android 实机内存峰值及复制/删除窗口尚未测量和验证

完整验证范围包含此前的全部复制用例、7 条删除状态用例和对应的实机操作项;结果表可填写实际结果。PR Check 按现有 PR 配置运行,不将派发受理视为编译或测试通过。

证据 / Evidence

检查清单 / Checklist

  • 我已记录可复现验证和未运行项原因 / Reproducible verification and reasons for unrun checks are recorded
  • 日常开发 PR 的目标分支为 dev;如目标为 main,我已说明这是维护者发布同步 / The target branch is dev for regular work; if it is main, I explained why this is a maintainer-led release sync
  • 我已确认 Candidate checks 覆盖改动范围,并会处理技术失败项 / Candidate checks covers the change scope and technical failures will be addressed
  • 最终 diff 无无关、临时、生成、二进制或敏感内容 / Final diff has no unrelated, temporary, generated, binary, or secret content
  • 已提供对应的回归、UI、文档/字符串或兼容性证据 / Relevant regression, UI, docs/strings, or compatibility evidence is provided

@3316891527 3316891527 changed the title fix(workspace): 优化复制内存并显示粘贴进度 fix(workspace): 优化文件操作内存并显示进度 Oct 30, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant