win-rar 0.1.0

A Windows archive manager supporting ZIP, 7z, RAR, TAR with encryption, shell integration, and drag-and-drop
# WinRAR

一款基于 Tauri 2 + React 构建的 Windows 原生压缩解压工具,支持 ZIP、7z、RAR、TAR 等主流格式的压缩与解压。

## 为什么选择 WinRAR?

- **多格式支持** — ZIP、7z、RAR、TAR、TAR.GZ、TAR.BZ2、TAR.XZ 一站式覆盖
- **原生性能** — 基于 Tauri 2 框架,Rust 后端 + WebView 前端,安装包小、启动快、内存占用低
- **安全可靠** — 内置 Zip Slip 路径遍历攻击防护,所有解压路径均经过安全校验
- **加密保护** — 支持 ZIP/7z 密码加密压缩与解压,AES-256 加密算法
- **右键集成** — 注册 Windows 右键菜单,右键即可"用 WinRAR 打开"或"解压到当前目录"
- **拖放操作** — 拖入压缩文件自动解压,拖入普通文件自动进入压缩模式
- **选择性解压** — 支持勾选部分文件单独解压,无需解压整个归档
- **实时进度** — 解压/压缩过程实时显示进度百分比和当前文件
- **分卷压缩** — 支持自定义分卷大小(如 100MB、1GB)
- **密码重试** — 解压加密文件时支持最多 3 次密码重试,无需重新操作

## 功能概览

| 功能 | ZIP | 7z | RAR | TAR | TAR.GZ | TAR.BZ2 | TAR.XZ |
|------|-----|----|-----|-----|--------|---------|--------|
| 解压 ||||||||
| 压缩 ||| ⚠️ |||||
| 密码加密 ||| - | - | - | - | - |
| 选择性解压 ||||||||

> ⚠️ RAR 压缩需要系统安装 WinRAR(自动检测)

## 快速开始

### 环境要求

- **Node.js** >= 18
- **Rust** >= 1.70(推荐通过 [rustup]https://rustup.rs/ 安装)
- **Windows 10/11**

### 安装依赖

```bash
# 安装前端依赖
npm install

# Rust 依赖会在首次构建时自动安装
```

### 开发模式

```bash
npm run tauri dev
```

启动后即可在开发窗口中调试应用,前端热更新,后端修改自动重编译。

### 构建发布

```bash
npm run tauri build
```

构建产物位于 `src-tauri/target/release/bundle/`,包含 MSI 安装包和 NSIS 安装包。

## 使用说明

### 解压文件

1. 点击"打开"按钮或拖放压缩文件到窗口
2. 浏览归档内文件列表,可勾选需要解压的文件
3. 点击"解压"按钮,选择输出目录
4. 如文件加密,会弹出密码输入框(最多重试 3 次)

### 压缩文件

1. 点击"压缩"按钮或拖放普通文件到窗口
2. 在压缩对话框中设置:
   - 归档格式(ZIP / 7z / TAR.GZ / TAR.BZ2 / TAR.XZ / TAR / RAR)
   - 输出路径
   - 密码(可选)
   - 压缩级别(仅存储 / 最快 / 快速 / 标准 / 较好 / 最佳)
   - 分卷大小(可选,如 `100m``1g`3. 点击"确定"开始压缩

### 右键菜单

安装后自动注册 Windows 右键菜单:

- 压缩文件右键 → **用 WinRAR 打开** / **解压到当前目录**
- 文件夹右键 → **添加到压缩包...**

## 二次开发

### 项目结构

```
win-rar/
├── src/                          # 前端(React + TypeScript)
│   ├── App.tsx                   # 主应用组件
│   ├── types.ts                  # 类型定义
│   ├── main.tsx                  # 入口
│   └── components/
│       ├── CompressDialog.tsx    # 压缩对话框
│       ├── FileList.tsx          # 文件列表
│       ├── DropZone.tsx          # 拖放区域
│       ├── ContextMenu.tsx       # 右键菜单
│       ├── ProgressBar.tsx       # 进度条
│       └── SettingsDialog.tsx    # 设置对话框
├── src-tauri/                    # 后端(Rust + Tauri)
│   ├── src/
│   │   ├── lib.rs                # 应用入口与初始化
│   │   ├── main.rs               # 主函数
│   │   ├── shell.rs              # Windows 右键菜单注册
│   │   ├── archive/              # 压缩格式引擎
│   │   │   ├── types.rs          # 公共类型与安全工具
│   │   │   ├── zip_engine.rs     # ZIP 引擎
│   │   │   ├── rar_engine.rs     # RAR 引擎
│   │   │   ├── sevenz_engine.rs  # 7z 引擎
│   │   │   └── tar_engine.rs     # TAR 系列引擎
│   │   ├── commands/             # Tauri 命令
│   │   │   ├── archive.rs        # 压缩/解压命令
│   │   │   ├── system.rs         # 系统对话框命令
│   │   │   └── shell.rs          # 右键菜单命令
│   │   └── async_ops/            # 异步任务管理
│   ├── Cargo.toml                # Rust 依赖
│   └── tauri.conf.json           # Tauri 配置
├── package.json
└── README.md
```

### 添加新格式支持

1. `src-tauri/src/archive/` 下创建新引擎文件(如 `zstd_engine.rs`2. 实现 `list()``extract()` 函数,遵循现有引擎的接口模式
3.`types.rs``ArchiveFormat` 枚举中添加新格式
4.`commands/archive.rs``extract_archive``compress_files` 中添加匹配分支
5. 前端 `types.ts` 中同步添加格式类型

### 添加新 Tauri 命令

1. `src-tauri/src/commands/` 下实现命令函数,添加 `#[tauri::command]`2.`lib.rs``invoke_handler` 中注册
3. 前端通过 `invoke("command_name", { args })` 调用

### 技术栈

| 层级 | 技术 |
|------|------|
| 框架 | Tauri 2 |
| 前端 | React 18 + TypeScript + Vite |
| 后端 | Rust |
| ZIP | [zip]https://crates.io/crates/zip |
| RAR | [unrar-ng]https://crates.io/crates/unrar-ng |
| 7z | [sevenz-rust]https://crates.io/crates/sevenz-rust |
| TAR | [tar]https://crates.io/crates/tar + [flate2]https://crates.io/crates/flate2 + [bzip2]https://crates.io/crates/bzip2 + [xz2]https://crates.io/crates/xz2 |

## Bug 反馈

如果发现 Bug,请发送邮件至 **gyfinjava@163.com**,邮件中请包含:

- 操作系统版本
- 复现步骤
- 期望行为与实际行为
- 相关截图或错误日志

## 定制开发与技术服务

如需定制开发或技术服务,请通过邮箱联络:**gyfinjava@163.com**

## 开源协议

本项目基于 [MIT 协议](LICENSE) 开源。

Copyright (c) 北京锋通科技有限公司 — 郭玉峰、吴琼