![]()
专业的 Windows 应用存储重定向工具
将 C 盘应用无损迁移到其他磁盘,释放系统空间,保持应用正常运行
Windows 用户经常面临以下困扰:
Viap 的解决方案:
┌─────────────────────────────────────────────────────────────┐
│ Viap │
├─────────────────────────────────────────────────────────────┤
│ Frontend (React + TypeScript + Tailwind CSS) │
│ ┌─────────────┬─────────────┬─────────────┐ │
│ │ AppMigration│ MigHistory │ Settings │ ← 页面 │
│ ├─────────────┴─────────────┴─────────────┤ │
│ │ AppList │ DiskUsageBar │ Toast │ Modal │ ← 组件 │
│ ├──────────────────────────────────────────┤ │
│ │ CSS Variables │ Component Styles │ ← 样式系统 │
│ └──────────────────────────────────────────┘ │
├─────────────────────────────────────────────────────────────┤
│ Tauri IPC Bridge (@tauri-apps/api) │
├─────────────────────────────────────────────────────────────┤
│ Backend (Rust) │
│ ┌──────────────────────────────────────────┐ │
│ │ lib.rs — 模块枢纽(35 个 Tauri 命令) │ │
│ ├──────────────────────────────────────────┤ │
│ │ system/ │ │
│ │ • disk_usage.rs 磁盘容量扫描 │ │
│ │ • icon.rs EXE/DLL 图标提取 │ │
│ ├──────────────────────────────────────────┤ │
│ │ storage/ │ │
│ │ • data_dir.rs 数据目录配置管理 │ │
│ │ • history.rs 迁移记录持久化 │ │
│ ├──────────────────────────────────────────┤ │
│ │ folder_manager/ │ │
│ │ • mod.rs 大文件夹发现与迁移 │ │
│ ├──────────────────────────────────────────┤ │
│ │ app_manager/ │ │
│ │ • cache.rs 内存级应用缓存 │ │
│ │ • scanner.rs 三级扫描引擎 │ │
│ │ • snapshot.rs 应用快照与图标 URL │ │
│ │ • migration.rs 应用迁移引擎 │ │
│ │ • uninstaller.rs 卸载与残留清理 │ │
│ │ • detector.rs 特殊目录检测 │ │
│ │ • log_macros.rs 统一日志宏 │ │
│ ├──────────────────────────────────────────┤ │
│ │ models.rs 共享数据结构 │ │
│ │ utils.rs 文件系统工具函数 │ │
│ └──────────────────────────────────────────┘ │
├─────────────────────────────────────────────────────────────┤
│ Windows OS │
│ • NTFS Symbolic Links (符号链接) │
│ • Registry (注册表) │
│ • File System (文件系统) │
└─────────────────────────────────────────────────────────────┘
viap/
├── src/ # 前端源码
│ ├── components/ # React 组件
│ │ ├── AppList.tsx # 应用列表(含批量选择 + 流式扫描进度提示)
│ │ ├── CleanupModal.tsx # 残留清理弹窗
│ │ ├── DiskUsageBar.tsx # 磁盘使用率
│ │ ├── FilterSelect.tsx # 下拉筛选组件
│ │ ├── MigrationModal.tsx # 迁移进度弹窗
│ │ ├── ProjectPromoModal.tsx # 项目推介弹窗
│ │ ├── TargetPickerDialog.tsx # 迁移目录选择弹窗
│ │ ├── TitleBar.tsx # 标题栏(集成 Tab 导航 + 磁盘状态)
│ │ ├── Toast.tsx # 通知组件
│ │ ├── UpdateNotification.tsx # 自动更新横幅
│ │ └── WarningConfirmDialog.tsx # 高风险路径确认弹窗
│ ├── pages/ # 页面
│ │ ├── AppMigration.tsx # 应用迁移页(还原/卸载/批量)
│ │ ├── LargeFolders.tsx # 数据迁移页
│ │ ├── MigrationHistory.tsx # 迁移历史页(搜索/筛选/分页/详情面板)
│ │ └── Settings.tsx # 设置页(幽灵清理/导入导出)
│ ├── store/ # 全局状态
│ │ └── appStore.ts # 应用列表模块级单例缓存
│ ├── hooks/ # 自定义 Hook
│ │ ├── useDangerousPathCheck.ts # 危险路径检测(迁移前拦截)
│ │ ├── useTheme.ts # 主题切换
│ │ └── useUpdater.ts # 自动更新检测(check/download/进度跟踪)
│ ├── utils/ # 工具函数
│ │ ├── logger.ts # 统一日志工具
│ │ └── migrationMessages.ts # 迁移错误/内部状态码中文化
│ ├── styles/ # 样式系统
│ │ ├── variables.css # CSS 变量定义
│ │ └── components.css # 通用组件样式
│ ├── App.tsx # 主应用
│ ├── index.css # 全局样式
│ └── types.ts # TypeScript 类型定义
├── src-tauri/ # Rust 后端
│ ├── src/
│ │ ├── main.rs # 程序入口
│ │ ├── lib.rs # 模块枢纽(35 个命令注册)
│ │ ├── models.rs # 共享数据结构
│ │ ├── utils.rs # 文件系统工具函数
│ │ ├── system/ # 系统接口层
│ │ │ ├── disk_usage.rs # 磁盘容量/使用率扫描
│ │ │ └── icon.rs # 图标提取(内存缓存 + SHA1 磁盘缓存,跨重启命中)
│ │ ├── storage/ # 存储层
│ │ │ ├── data_dir.rs # 数据目录配置管理
│ │ │ ├── history.rs # 迁移记录持久化(JSON)
│ │ │ └── size_cache.rs # 目录大小 SWR 缓存(启动秒发缓存,后台重算更新)
│ │ ├── folder_manager/ # 文件夹管理层
│ │ │ └── mod.rs # 大文件夹发现、迁移与恢复
│ │ └── app_manager/ # 应用管理层
│ │ ├── mod.rs
│ │ ├── cache.rs # 内存级应用缓存(AppCache 全局单例,含图标复用保护)
│ │ ├── snapshot.rs # 应用列表持久化快照 + viap-icon 图标 URL
│ │ ├── scanner.rs # 流式扫描引擎(注册表 → LNK → FS 三级,分批推送)
│ │ ├── migration.rs # 迁移引擎(6 步流程:验证 → 占用检测 → 空间检查 → 复制 → 删除源 → Junction)
│ │ ├── uninstaller.rs # 卸载/残留扫描/强制删除
│ │ ├── detector.rs # 特殊目录动态检测
│ │ └── log_macros.rs # 统一日志宏
│ ├── capabilities/
│ │ └── default.json # Tauri 权限配置
│ ├── icons/ # 应用图标
│ ├── Cargo.toml # Rust 依赖
│ └── tauri.conf.json # Tauri 配置
├── scripts/ # 工具脚本
│ ├── generate-icons.js # PNG 图标生成
│ └── generate-ico.js # ICO 文件生成
└── package.json # Node.js 依赖
# 安装前端依赖
npm install
# Rust 依赖会在构建时自动安装
npm run tauri dev
npm run tauri build
请以管理员身份运行应用
迁移前检查
建议先备份重要数据
不建议迁移的应用
详见用户手册中的完整危险路径分级规则表
迁移后注意
项目提供了图标生成脚本:
# 1. 生成各尺寸 PNG 图标
node scripts/generate-icons.js
# 2. 生成 Windows ICO 文件
node scripts/generate-ico.js
源 SVG 文件位于 src-tauri/icons/icon.svg
应用启动后自动检查新版本,发现更新后一键下载安装:
应用列表采用流式加载架构,告别"等待全部扫描完成才能看到结果":
{data_dir}/cache/app_snapshot.json,下次进入应用管理页先推送 snapshot 阶段,立即显示上次列表,再由后台扫描校验刷新scan-progress 事件推送到前端,Tier 1 完成即可显示首批应用http://viap-icon.localhost/<hex> URL,前端 <img> 按需请求真实 PNG;后端协议处理器命中图标磁盘缓存或即时提取,避免 Base64 批量 IPCappStore 模块级单例:应用列表缓存在模块作用域内,Tab 切换零 IPC 恢复,不重新扫描scan-performance 事件展示 snapshot、registry、shortcuts、filesystem、icons 和 sizes 阶段耗时;折叠后仅保留小图标,手动刷新也会重新生成本次耗时,便于用户反馈时截图定位慢阶段Viap 使用 Windows Win32 API 提取应用的真实图标:
viap-icon 协议直接返回 PNG 字节,前端优先使用 icon_url,仅兼容旧数据时回退 icon_base64微软商店应用(Microsoft Store / UWP / MSIX)通常位于 C:\Program Files\WindowsApps,由 Windows 包部署、权限、签名和更新机制统一管理。Viap 不建议也不作为可迁移应用处理此类目录;部分商店应用会在 Windows 设置中提供「移动」按钮,也可通过存储设置调整新应用默认保存位置,应优先使用 Windows 提供的迁移方式。
首页顶部显示所有本地磁盘的使用情况:
支持多选应用一键批量迁移:
点击已迁移应用的「还原」按钮时: - 按钮立即切换为 loading 态(spinner + "还原中") - 还原完成/失败后自动恢复,配合 Toast 通知结果
支持迁移系统文件夹、应用数据和自定义文件夹:
系统文件夹: - 桌面 (Desktop)、文档 (Documents)、下载 (Downloads)、图片 (Pictures)、视频 (Videos)
应用数据(动态检测路径,含注册表/配置文件回退): - 微信 / 企业微信 / QQ / 钉钉 / 飞书(含 6 个候选路径) - Chrome 缓存 / Edge 缓存 / VS Code 扩展 / npm 全局包
迁移特性(与应用管理页一致):
- 进度弹窗 — 复用 MigrationModal,扫描阶段持续显示已扫描文件数/体积,复制阶段显示已复制体积和百分比
- 扫描计划复用 — 迁移前扫描一次生成复制计划,同时用于空间检查和复制执行,避免空间统计与复制列表各扫一遍磁盘
- 恢复进度可见 — 应用管理、数据迁移、迁移记录的恢复/还原按钮会显示后端推送的百分比
- 安全取消 — 迁移进行中可取消,后端自动回滚已复制文件;关闭弹窗需二次确认
- 批量迁移 — 支持全选/多选文件夹,一键批量迁移到统一目标目录,按序执行,失败不影响后续
- 异步非阻塞 — migrate_large_folder 改为主线程 async + spawn_blocking,返回 MigrationResult,行为与 migrate_app 一致
- 进程占用检查 — 迁移前检测关联进程,非系统文件夹被占用时提示关闭,系统文件夹允许强制继续
- 系统文件夹风险提示 — 风险确认弹窗(RiskConfirmModal)仅在系统文件夹迁移前显示,非系统文件夹直接启动
安全特性: - 系统文件夹迁移前显示风险警告 - 自动检测进程占用,提示关闭相关应用 - 支持一键恢复到原位置 - 迁移进度实时可见,可随时安全取消 - 大小始终推送事件(即使为 0),避免前端永久显示 "--"
Viap 的强力卸载对标 Geek Uninstaller 等专业工具,提供完整的卸载 → 残留扫描 → 安全清理链路:
卸载命令执行:
1. 预览卸载命令(preview_uninstall),在确认对话框中展示
2. 四层命令解析回退:registry_path → DisplayName 匹配 → InstallLocation 匹配 → 文件系统扫描(含 "unin"/"uninstall"/"卸载")
3. 三级回退执行策略:直接 exe → cmd /C → start /wait
4. 自动检测权限不足 → PowerShell Start-Process -Verb RunAs 提权重试
5. 静默参数追加(/S /silent /verysilent /qn /quiet)
6. 轮询注册表 + 文件系统确认卸载完成(含 Inno Setup fork 延迟适配)
强制删除(Force Remove): - 当应用卸载程序损坏/缺失时,自动提供强制删除选项 - 直接删除安装目录(三级回退:直接删 → 清除只读 → takeown + icacls) - 清理注册表 Uninstall 键
残留扫描(三路并行): 1. 文件系统扫描:AppData / LocalAppData / ProgramData / 安装路径,深度 5 2. Uninstall 注册表扫描:HKLM + HKCU × 3 路径 3. 发布商路径扫描:Software\ × 4 路径(HKLM/HKCU × 普通/WOW6432Node) 4. 文件关联扫描:Software\Classes\Applications\ × 2 路径 5. 扫描时机修正:卸载完成后才触发,适配便携/绿色软件的安装检测
残留清理弹窗: - 紧凑设计(640px 宽),可滚动列表,所有项目默认选中 - 类型标签 + 路径 + 大小在一行内展示 - AlertTriangle 警告图标提示不可恢复
安全清理: - 系统目录黑名单(Windows、System32 等) - 注册表安全校验(拒绝 Microsoft/Windows、要求 ≥3 级路径) - 批量选中 + 一键清理,按体积降序排列
用户设置保存在 localStorage 中:
defaultAppTargetPath:应用管理页迁移时优先使用此路径defaultDataTargetPath:数据管理页迁移时优先使用此路径defaultTargetPath 配置自动升迁为 defaultAppTargetPath迁移操作时统一遵循以下约定,确保用户始终明确目标位置:
迁移历史记录保存在 %APPDATA%/viap/migration_history.json:
.json.tmp),再重命名覆盖目标文件,防止断电/崩溃导致数据损坏.json.bakrestore_app 按 record_type 自动分发,确保 history 记录状态正确更新项目使用模块化 CSS 变量系统,定义在 src/styles/variables.css:
--color-primary, --color-success, --color-warning, --color-danger--spacing-1 到 --spacing-16(基于 4px)--radius-sm, --radius-md, --radius-lg, --radius-xl--shadow-sm, --shadow-md, --shadow-lgapp_manager/、storage/、folder_manager/)src-tauri/src/lib.rs 中注册命令路由(直接引用模块路径或创建委托函数)invoke('command_name', { args }) 调用MIT License
欢迎提交 Issue 和 Pull Request!