桌面使用与辅助功能
ZiFile 桌面端以 Rust 和 Iced 实现。压缩、校验与解压在后台任务中执行,界面显示条目/字节进度,并允许取消;文件名、文件内容和密码不会上传。
CLI 密码输入
Section titled “CLI 密码输入”CLI 不接受会进入进程参数和命令历史的 --password <值>。加密的 list、test、extract 和 create 使用 --password-stdin,从标准输入读取一行非空密码;只删除行尾,密码前后空格会保留。
$password | zifile test archive.7z --password-stdin$password | zifile extract archive.7z output --password-stdin首次启动根据系统区域选择简体中文或英文。左下角可随时切换语言和深浅主题。ZiFile 在 %LOCALAPPDATA%\ZiFile\settings.conf 保存语言、主题以及最多 8 个成功打开的本地压缩文件路径;不会保存密码、归档内容或失败打开的路径。最近记录以 Windows 路径身份去重,主页可一键重新打开、逐项移除或全部清空;这些操作只删除本地历史,不影响文件和当前归档会话。
设置先写入临时文件并 flush/sync,再通过 Windows 原子替换更新正式文件;路径使用有界十六进制字段编码,避免换行或等号破坏配置结构。保存失败会显示双语错误,不会静默覆盖为半写内容。
| 快捷键 | 操作 |
|---|---|
Ctrl+O |
打开压缩文件 |
Ctrl+N |
进入创建页 |
Ctrl+R |
重新加载当前压缩文件 |
Ctrl+F |
聚焦当前压缩文件的搜索框 |
Ctrl+W |
关闭当前压缩文件并返回首页 |
Ctrl+A |
在归档页选择全部条目 |
Ctrl+I |
反选当前归档中的全部文件 |
F1 |
打开关于与快捷键帮助 |
Escape |
取消当前可取消任务 |
归档页标题栏也提供“关闭压缩文件”按钮。关闭操作会立即释放当前归档密码、条目元数据、选择、搜索和文件夹导航状态,并返回首页;正在运行或排队交接中的任务完成前不能关闭当前归档。
归档选择区提供明确的“全选”“全不选”和“反选”按钮;作用域始终是整个归档中的普通文件,不受当前文件夹、搜索词或分页影响,目录仍只作为导航节点。Ctrl+A 全选,Ctrl+I 反选;每次批量变化都会在状态区报告最新选择数量。
归档页的“解压到同名文件夹”不打开文件夹选择器,而是把全部内容解压到压缩文件旁的同名目录。例如 示例.zip 使用 示例/,backup.tar.gz 使用 backup/。它与资源管理器右键命令共用命名规则,并继续使用当前冲突策略、操作队列、隔离 Worker 和完成后的“查看输出”;需要自选位置时使用“解压全部”。
对 ZIP、7z 和 TAR 组合,归档页还提供“添加到压缩文件”“将文件夹添加到压缩文件”和“移除所选项目”。ZiFile 会在原归档同目录创建有界临时工作区,先完整解包,再合并新增来源或删除所选归档相对路径及其后代,最后重建同格式归档;只有重建、校验和取消检查都成功后才替换原文件。相同相对路径的新增普通文件会更新旧文件,文件/目录类型冲突、符号链接、RAR/CAB 和单文件压缩流会明确拒绝,失败不会留下半成品原归档。
选择至少两个普通文件时,归档页还会启用“批量重命名”。查找/替换、前缀和后缀规则只作用于文件名并保留所在目录;提交前会过滤未变化的项目,随后复用核心的归档相对路径、冲突和原子替换检查。切换目录、重新加载、改变选择或关闭归档会清除未提交的批量规则。
归档路径可即时搜索。结果按每页 500 项显示,避免把整个大型归档一次性构造成 UI 控件。搜索会返回第一页;上一页和下一页按钮用于浏览结果。安全核心仍会在列出阶段执行条目数、展开大小和压缩倍率限制。
完整性校验和
Section titled “完整性校验和”“校验压缩文件”会在相同安全限制下解码每个普通文件,并记录小写十六进制 SHA-256。校验成功后,两套桌面 UI 会用校验结果替换当前元数据;归档表格中的“SHA-256 校验和”列提供明确的“复制校验和”操作,也可直接复核。目录显示 —,普通列出操作不会解码文件内容;CLI 输出相同的 SHA256\tPATH 表格。
打开归档后,标题栏的“在资源管理器中显示”会打开归档所在目录并选中当前文件;这是本机操作,失败时会以错误状态提示。成功打开归档本身会按上文规则更新最近记录,但“在资源管理器中显示”不会新增其他记录或日志。
Windows 任务栏
Section titled “Windows 任务栏”Worker 的字节进度(无字节总量时回退到条目进度)同步到 Windows 任务栏;未知总量使用不确定状态,取消中使用暂停状态,任务结束后清除。任务栏集成失败不得影响归档操作。
运行归档任务时仍可提交打开、重载、完整性校验、解压、创建或更新。ZiFile 按提交顺序串行执行,状态栏显示等待数量;“清空队列”只删除尚未开始的任务,“取消”只取消当前 Worker,随后继续下一项。队列最多容纳 32 项(包括运行中任务),避免无限占用内存。
大型归档在完整性校验、解压或创建任务运行期间显示轻量摘要而暂时不重建项目表格;取消、继续排队、打开其他文件和资源管理器定位仍可用,任务结束后表格自动恢复。这避免高频进度刷新反复扫描大型归档。
每个排队请求只保存在当前进程内,并在提交时快照来源、目标、冲突策略和密码。创建请求被执行或排队接受后,两套桌面 UI 会立即清空创建表单密码;队列已满而拒绝请求时保留输入,便于用户重试。清空、执行完成或退出会释放请求快照;设置文件和日志不记录队列、密码、创建来源或输出目标,只有成功列出的归档路径按上文最近记录规则保存。对目标路径有先后依赖的任务仍应按安全顺序提交,因为 ZiFile 不会猜测任务间依赖。
创建或解压成功后,状态栏提供双语“查看输出”操作,在资源管理器中选中生成的压缩文件或解压目录。开始新任务时会清除旧输出动作;失败、取消和 Worker 协议结果类型不匹配不会留下可点击的成功路径,避免状态文本与后续操作指向不同任务。
已验证与待验证
Section titled “已验证与待验证”2026-08-28 fresh full-workflow 键盘回合已通过本机 x64 可访问候选:正反向导航、ZIP 归档校验与 Reload、密码框和搜索作用域 Ctrl+A、选择/冲突策略、解压状态以及创建表单均完成。该结果只覆盖可重复的 UI Automation 前台会话;Narrator、IME、高对比度、DPI、物理 ARM64 和正式辅助技术认证继续待验证。
自动测试与 Criterion 已覆盖 100,000 个模拟条目的过滤和有界分页;Windows 实机已检查 1,200 项 ZIP 的三页翻页、搜索、中英文、深浅主题及 Ctrl+N。Dioxus 候选另以真实 2 项 ZIP 验证归档区 Ctrl+A、动态选择标签与 live status,并以真实 100,000 项 ZIP 验证 Worker 列出、500 行有界 UIA 表格、搜索、多页导航和加载取消。五轮加载取消均进入最终取消状态,且对应 Worker 已退出。
独立键盘回合已从干净启动点用 Tab/Shift+Tab/Enter 正反向切换首页、归档页与创建页,并用键盘切换主题和语言;Ctrl+N、Ctrl+O 与文件选择器 Escape 取消也通过。随后新增的前台保护脚本直接读取 WebView2 内部 FocusedElement,在中英文流程中复验导航顺序、disabled 按钮跳过、7z 格式选择、压缩等级 6→7→6、密码键入/清空和来源按钮可达。测试不会输出密码,用户切换到其他窗口时拒绝继续发送按键。
归档选择区现在把全选复选框命名为“选择全部归档文件”或“清除全部归档文件选择”,并用原子 aria-live 状态报告“已选择 N/总数项”。归档表格区域和“解压选中项”按钮通过 aria-describedby 引用同一摘要;单项勾选或取消会在全局状态中报告路径和最新数量。中英文动作、摘要、单复数和状态变化由候选二进制的纯 Rust 单测覆盖。该证据证明语义接线和状态文案,不替代 Narrator 实机遍历。
归档搜索现在始终显示“匹配数/总项目数”摘要,搜索输入与结果表格通过 aria-describedby/aria-controls 关联该摘要和表格;0 项时显示明确的双语空结果,不再保留无意义的“第 1/1 页”分页。为避免实时过滤在每次按键后产生 live 播报,摘要固定 aria-live=off;用户按 Enter 时才通过全局 polite 状态播报当前结果,显式“清除搜索”按钮会清空关键词、复位页码并播报全部数量。中英文单复数、筛选和空结果文案由 Rust 单测覆盖。
默认 Iced 的搜索栏也显示同一匹配统计;当结果为 0 时页码位置显示占位符而不是虚构的“第 1/1 页”,并继续在列表区域显示明确的空结果提示。摘要格式由共享双语函数提供,避免两套 UI 的单复数或 0 项行为漂移。
全局状态区区分普通信息与错误:排队、取消和选择变化使用 role=status/polite;Worker 失败、队列满、意外 Worker 结果和内部队列错误使用原子 role=alert/assertive,并提供普通主题错误强调与强制颜色系统色。状态消息、队列数量和进度条现在是三个独立语义区域,高频进度值不再位于原子 live region 内,避免每 100 ms 重新播报整个页脚。进度条通过 aria-valuetext 提供百分比、已处理/总字节和项目数,取消按钮引用当前操作状态并公开 Escape 快捷键,清空队列按钮引用独立的单复数队列摘要。单测锁定中英文进度/队列文案和“只让错误打断”的契约;该代码级证据仍需 Narrator 实机复核。
默认 Iced 界面也维护同一套 Informational/Error 状态语义:成功、进度、排队、取消和来源选择使用普通状态栏;Worker 失败、创建预检失败、队列已满、偏好设置保存失败和内部队列错误使用 danger 主题,避免失败反馈只靠文字颜色或用户逐字阅读才能发现。该视觉映射由桌面单测覆盖,仍需在不同 Windows 主题、强制颜色和 DPI 设置下做实机检查。
创建页来源列表也提供原子 live 数量摘要。每个“移除”按钮的可访问名称包含对应完整路径,不再是一组无法区分的同名按钮;添加文件、添加文件夹、拖入、移除和清空都会报告本次变化及剩余总数。移除按路径匹配而不是依赖可能过期的列表索引。中英文路径/数量文案和单复数由 Rust 单测覆盖。
创建输入要求来自共享核心能力:ZIP、7z 和 TAR 组合接受文件与文件夹,七种单流格式只接受恰好一个现有文件。Iced 基线和 Dioxus 候选都会在切换格式时播报当前来源要求,为单流格式打开单文件选择器、禁用“添加文件夹”,在来源不合法时禁用创建,并在打开保存对话框前显示中英文修复建议;防御性预检还会阻止绕过 UI 的无效提交,并以错误语义播报失败。
拖放入口由共享桌面函数统一分类:先读取最多一个小头部并使用内容签名识别归档,再在格式没有通用 magic 或探测失败时回退到已知扩展提示。这样改名为 .bin 的有效 ZIP/7z 等归档仍可进入浏览页,普通文件才会进入创建来源列表。Iced 使用 Task::perform,Dioxus 使用 spawn_blocking 执行这个小探测,慢速或远程文件不会阻塞窗口;最终列表操作仍由 Worker 完成。
打开归档、选择解压目录、添加文件/文件夹和保存新归档使用后台文件对话框路径。Iced 将原生同步对话框放入受控 Tokio 阻塞任务,Dioxus 使用 rfd::AsyncFileDialog;两套 UI 都有活动对话框门禁,取消或完成后才允许再次打开,避免网络目录或重复点击冻结/叠加窗口。
创建来源在同一个共享函数中按路径身份去重。Windows 下路径大小写和正反斜杠差异不会把同一个文件重复加入;因此文件选择器、Explorer 多选和拖放混用时,不会把重复根目录带入 Worker。
创建格式菜单顺序由核心 ArchiveFormat::CREATABLE 注册表统一提供,Iced 基线与 Dioxus 候选不再各自维护格式数组;新增可创建 Provider 时,核心能力、CLI 契约和两套 UI 会在同一处获得稳定顺序。契约冒烟会锁定当前 18 个创建格式,避免菜单与公开格式矩阵悄然分叉。
保存新归档时,如果用户在原生保存对话框中输入的名称没有扩展名,两套 UI 会按所选格式补上规范扩展名(例如 backup 变为 backup.zip 或 backup.tar.gz);用户明确输入的其他扩展名会保留,不会被静默覆盖。
共享队列的 FIFO、容量、陈旧完成保护、清空语义和敏感载荷释放已有纯单元测试,两套 UI 已通过严格 Clippy 与全 feature 测试;真实前台多任务 UI 冒烟仍待无干扰交互回合,因此路线图暂不标记完成。
Windows 11 Explorer 扩展由纯 Rust COM DLL 提供两个现代命令,注册到选中的文件、文件夹以及文件夹背景:“使用 ZiFile 创建压缩文件”会把最多 256 个来源送入创建页,右键文件夹空白区域时把当前文件夹作为来源;“使用 ZiFile 解压到同名目录”只对单个受支持归档显示,并以 --extract-here 打开可见桌面窗口。DLL 保持 Explorer 菜单构建路径有界:Explorer 不允许慢速状态计算时立即返回 E_PENDING,只有允许的状态阶段或用户真正调用后才解析文件系统路径。桌面在签名优先列出成功后选择全部普通文件,解压到归档旁的同名目录并对冲突重命名;进度、取消、安全限制和密码重试仍由桌面与隔离 Worker 负责,DLL 本身不解析归档或接触密码。真实 Explorer 激活仍需可信安装包验证。
打开失败时,桌面会区分可能需要密码的归档错误与损坏、未知格式或普通 I/O 错误;只有前者显示密码输入和解锁重试,避免把所有失败误导为加密问题。异步 Worker 返回结果前还会校验活动 operation id,旧任务结果不会覆盖当前界面状态。
解锁、校验/解压和创建加密归档的密码框均提供“显示密码”复选框,默认保持遮蔽。显示状态只驻留当前 UI 会话,不写入设置;切换归档、关闭归档、清除密码、提交创建任务或改选不支持加密的格式时会恢复遮蔽。可访问候选使用原生复选框、显式标签和 aria-controls 将每个开关限定到对应密码框。
当加密文件列表等待密码时,在输入框按 Enter 会执行与“解锁压缩文件”按钮相同的重新加载操作。可访问候选会忽略 IME 组合输入和带修饰键的 Enter;操作已经运行时,两套 UI 都不会重复提交。
当另一个操作正在运行时打开新的归档,默认 Iced UI 会保留当前可见归档,直到新的列出任务真正开始。排队请求或因队列已满而被拒绝的请求都不会清空当前归档或留下误导性的空状态。
Worker 正在打开归档时,空状态会显示“正在打开”而不是提前显示失败;只有非密码错误返回后才显示重试提示,密码相关错误则显示解锁表单。加载中、失败、密码和空闲四种状态由两套 UI 共用的双语函数与单测锁定。
解压命令在 Explorer 允许慢查询时复用核心 detect_format 与格式能力,不再维护第二份后缀白名单;因此有效归档即使被改名也能显示命令,而无效文件不会因为伪造 .zip 后缀出现;同时要求 Shell 项目实际是文件,因此名为 backup.zip 的普通文件夹不会错误显示解压操作。
Shell DLL 同时维护活动 COM 对象和 LockServer 计数;仅当两者都归零时才允许 DllCanUnloadNow 返回成功,避免扩展无故常驻,也避免 Explorer 在仍有调用者时卸载它。
当 Explorer 在文件夹背景菜单中传入空的 IShellItemArray 时,创建命令通过 IObjectWithSite 查询当前 IShellBrowser/IFolderView,取得当前文件夹后再以单个来源打开创建页;如果站点不可用则安全禁用/拒绝调用,不猜测路径。
Shell 创建命令在启动桌面前也会按 Windows 路径身份去重 Explorer 来源,拒绝已消失的路径、符号链接和 junction/reparse point,避免虚拟项目或失效来源先显示为可用;默认 Iced 与可访问 Dioxus 创建页也在打开保存对话框前执行同一 link-like 预检;文件选择与文件夹背景都经过同一命令行预算校验,极深的当前目录会在启动桌面前被拒绝;解压命令仍严格要求 Explorer 只传入一个项目。
该实现遵循 Microsoft 的 Windows 11 打包桌面应用 Explorer 命令指南:使用 *、Directory 和 Directory\Background 注册目标,并将耗时工作推迟到 Invoke 之后。
这些检查尚不等同于完整辅助功能认证。当前 Iced 0.14 UI 不能宣称具备完整的 Windows UI Automation/Narrator 语义树。中文 IME、归档页完整实际键盘/Narrator 遍历、可见焦点、屏幕阅读器、高对比度、每显示器 DPI 和 Windows Application Certification Kit 仍是上架前门禁。可访问 UI 路线见 ADR-0005。
可访问 UI 候选
Section titled “可访问 UI 候选”开发者可用以下命令构建候选;它不会替换默认 Iced 可执行文件:
cargo build -p zifile-desktop --features accessible-ui --bin zifile-desktop-accessibletarget\debug\zifile-desktop-accessible.exe sample.zip候选使用 Rust RSX + Dioxus Desktop/WebView2,并复用 zifile-worker.exe。当前可执行打开、列出、校验、选择性解压和创建流程;命令行参数可直接打开归档。x64/ARM64 候选构建、打包、校验和、SBOM、来源证明、离线 CSP、原生拖放和核心快捷键链路已接通;替换默认 UI 前仍需完整辅助功能验证、真实拖放复验和 ARM64 实机运行。