文件压缩工具


欢迎加入开源鸿蒙跨平台社区:
https://openharmonycrossplatform.csdn.net

适配的第三方库地址:

  • shared_preferences: https://pub.dev/packages/shared_preferences

一、项目概述

运行效果图

image-20260412165826419

image-20260412170017040

image-20260412170025899

image-20260412170033697

image-20260412170048973

1.1 应用简介

文件压缩工具是一款专业的文件压缩与解压管理应用,支持多种主流压缩格式,帮助用户高效管理文件存储空间。应用提供直观的文件选择界面、灵活的压缩设置选项、实时的任务进度显示,让文件压缩变得简单高效。

应用以深邃的紫色为主色调,象征专业与高效。涵盖文件压缩、任务管理、设置管理三大模块。用户可以选择文件、设置压缩参数、查看压缩进度,实现一键压缩解压操作。

1.2 核心功能

功能模块 功能描述 实现方式
文件选择 多文件批量选择 Checkbox列表
压缩格式 五种主流格式支持 枚举定义
压缩级别 四级压缩级别 Radio选择
批量处理 多任务并行处理 任务队列
进度显示 实时压缩进度 进度条组件
压缩统计 压缩率计算 数据分析
密码保护 压缩包加密 密码设置
设置持久化 保存用户配置 SharedPreferences

1.3 压缩格式定义

序号 格式名称 扩展名 描述 特点
1 ZIP .zip 通用压缩格式 兼容性最好
2 RAR .rar 高压缩率格式 压缩率高
3 7Z .7z 高压缩比格式 开源免费
4 TAR .tar 归档格式 仅打包
5 GZ .gz Gzip压缩 单文件压缩

1.4 压缩级别定义

序号 级别名称 级别值 描述 适用场景
1 无压缩 0 仅打包不压缩 快速打包
2 快速 1 压缩速度快 临时文件
3 标准 5 平衡速度与压缩率 日常使用
4 最大 9 压缩率最高 长期存储

1.5 任务状态定义

序号 状态名称 Emoji 描述
1 等待中 任务在队列中等待
2 压缩中 🔄 正在进行压缩
3 已完成 压缩成功完成
4 失败 压缩过程出错

1.6 技术栈

技术领域 技术选型 版本要求
开发框架 Flutter >= 3.0.0
编程语言 Dart >= 2.17.0
设计规范 Material Design 3 -
数据存储 SharedPreferences >= 2.0.0
状态管理 StatefulWidget -
目标平台 鸿蒙OS / Web API 21+

1.7 项目结构

lib/
└── main_file_compression.dart
    ├── FileCompressionApp           # 应用入口
    ├── CompressionFormat            # 压缩格式枚举
    ├── CompressionLevel             # 压缩级别枚举
    ├── CompressionSettings          # 压缩设置模型
    ├── CompressionTask              # 压缩任务模型
    ├── CompressionTaskStatus        # 任务状态枚举
    ├── MockFile                     # 模拟文件模型
    ├── CompressionStorage           # 设置存储服务
    ├── HomePage                     # 主页面(底部导航)
    ├── _buildCompressPage           # 压缩页面
    ├── _buildTasksPage              # 任务页面
    └── _buildSettingsPage           # 设置页面

二、系统架构

2.1 整体架构图

Data Layer

Business Layer

Presentation Layer

主页面
HomePage

压缩页面

任务页面

设置页面

文件列表

选择操作

压缩按钮

任务列表

进度显示

结果统计

格式设置

级别设置

高级选项

压缩管理器
CompressionManager

任务调度器
TaskScheduler

进度计算器
ProgressCalculator

CompressionSettings
设置模型

CompressionTask
任务模型

CompressionStorage
存储服务

2.2 类图设计

has

has

uses

has

manages

manages

selects

FileCompressionApp

+Widget build()

«enumeration»

CompressionFormat

+String label

+String extension

+IconData icon

+String description

+zip()

+rar()

+sevenZ()

+tar()

+gz()

«enumeration»

CompressionLevel

+String label

+int level

+IconData icon

+String description

+none()

+fast()

+normal()

+maximum()

CompressionSettings

+CompressionFormat format

+CompressionLevel level

+bool includeSubfolders

+bool preserveStructure

+String password

+bool encryptNames

+copyWith()

CompressionTask

+String id

+String name

+List<String> files

+CompressionSettings settings

+CompressionTaskStatus status

+double progress

+int originalSize

+int compressedSize

+DateTime createdAt

+compressionRatio

«enumeration»

CompressionTaskStatus

+pending()

+compressing()

+completed()

+failed()

MockFile

+String name

+String path

+int size

+String type

+DateTime modifiedAt

+formattedSize

HomePage

+CompressionSettings _settings

+List<MockFile> _selectedFiles

+List<CompressionTask> _tasks

+_startCompression()

+_simulateCompression()

2.3 页面导航流程

压缩

任务

设置

查看详情

删除任务

应用启动

加载设置

主页面

底部导航

压缩页面

任务页面

设置页面

选择文件

点击压缩

创建任务

开始压缩

查看任务列表

任务操作

任务详情

删除任务

修改设置

保存设置

2.4 压缩流程

任务页面 压缩引擎 任务管理器 压缩页面 用户 任务页面 压缩引擎 任务管理器 压缩页面 用户 loop [压缩过程] 选择文件 更新选择状态 点击压缩按钮 创建压缩任务 计算原始大小 添加任务到列表 开始压缩 应用压缩设置 更新进度 显示进度条 压缩完成 更新任务状态 显示完成结果

三、核心模块设计

3.1 数据模型设计

3.1.1 压缩格式枚举 (CompressionFormat)
enum CompressionFormat {
  zip('ZIP', '.zip', Icons.folder_zip, '通用压缩格式'),
  rar('RAR', '.rar', Icons.archive, '高压缩率格式'),
  sevenZ('7Z', '.7z', Icons.compress, '高压缩比格式'),
  tar('TAR', '.tar', Icons.inventory_2, '归档格式'),
  gz('GZ', '.gz', Icons.file_present, 'Gzip压缩');

  final String label;
  final String extension;
  final IconData icon;
  final String description;
  const CompressionFormat(this.label, this.extension, this.icon, this.description);
}
3.1.2 压缩级别枚举 (CompressionLevel)
enum CompressionLevel {
  none('无压缩', 0, Icons.remove_circle_outline, '仅打包不压缩'),
  fast('快速', 1, Icons.speed, '压缩速度快,压缩率低'),
  normal('标准', 5, Icons.balance, '平衡速度与压缩率'),
  maximum('最大', 9, Icons.compress, '压缩率最高,速度慢');

  final String label;
  final int level;
  final IconData icon;
  final String description;
  const CompressionLevel(this.label, this.level, this.icon, this.description);
}
3.1.3 压缩设置模型 (CompressionSettings)
class CompressionSettings {
  final CompressionFormat format;
  final CompressionLevel level;
  final bool includeSubfolders;
  final bool preserveStructure;
  final String password;
  final bool encryptNames;

  const CompressionSettings({
    this.format = CompressionFormat.zip,
    this.level = CompressionLevel.normal,
    this.includeSubfolders = true,
    this.preserveStructure = true,
    this.password = '',
    this.encryptNames = false,
  });

  CompressionSettings copyWith({
    CompressionFormat? format,
    CompressionLevel? level,
    bool? includeSubfolders,
    bool? preserveStructure,
    String? password,
    bool? encryptNames,
  }) {
    return CompressionSettings(
      format: format ?? this.format,
      level: level ?? this.level,
      includeSubfolders: includeSubfolders ?? this.includeSubfolders,
      preserveStructure: preserveStructure ?? this.preserveStructure,
      password: password ?? this.password,
      encryptNames: encryptNames ?? this.encryptNames,
    );
  }
}
3.1.4 压缩格式使用分布
45% 25% 15% 10% 5% 压缩格式使用分布示例 ZIP RAR 7Z TAR GZ

3.2 页面结构设计

3.2.1 主页面布局

HomePage

IndexedStack

压缩页面

任务页面

设置页面

NavigationBar

压缩 Tab

任务 Tab

设置 Tab

3.2.2 压缩页面结构

压缩页面

选择信息栏

文件列表

压缩按钮

选中数量

总大小

当前格式

文件卡片

文件图标

文件名

文件大小

选择框

3.2.3 任务页面结构

任务页面

任务列表

任务卡片

任务名称

状态标签

进度条

压缩统计

原始大小

压缩后大小

压缩率

3.2.4 设置页面结构

设置页面

压缩格式卡片

压缩级别卡片

高级选项卡片

安全设置卡片

格式选择Chips

级别Radio列表

子文件夹开关

目录结构开关

密码设置

加密文件名开关

3.3 压缩流程逻辑

开始压缩

创建压缩任务

计算原始大小

添加到任务队列

开始压缩模拟

更新进度

进度完成?

计算压缩后大小

计算压缩率

更新任务状态

显示完成结果

3.4 数据存储逻辑

应用启动

加载SharedPreferences

设置存在?

解析存储数据

使用默认设置

构建CompressionSettings

渲染页面

设置变更

序列化为列表

保存到SharedPreferences

更新UI


四、UI设计规范

4.1 配色方案

应用以深邃的紫色为主色调,象征专业与高效:

颜色类型 色值 用途
主色 #673AB7 (DeepPurple) 导航、主题元素
辅助色 #9575CD 渐变背景
背景色 #FAFAFA 页面背景
卡片背景 #FFFFFF 信息卡片
成功色 #4CAF50 完成状态
警告色 #FF9800 等待状态
错误色 #F44336 失败状态

4.2 任务状态配色

状态 色值 视觉效果
等待中 #FF9800 橙色
压缩中 #2196F3 蓝色
已完成 #4CAF50 绿色
失败 #F44336 红色

4.3 字体规范

元素 字号 字重 颜色
页面标题 20px Bold 白色
文件名 16px Regular #000000
文件大小 12px Regular #666666
任务名称 16px Bold #000000
统计数值 12px Bold #000000
状态标签 12px Bold 状态色

4.4 组件规范

4.4.1 文件选择卡片
┌─────────────────────────────────────┐
│  📄 项目文档.docx          ☑        │
│     2.4 MB · 1天前                  │
└─────────────────────────────────────┘

┌─────────────────────────────────────┐
│  🎨 设计稿.psd              ☐       │
│     50.0 MB · 3天前                 │
└─────────────────────────────────────┘
4.4.2 选择信息栏
┌─────────────────────────────────────┐
│  📦 已选择 3 个文件          ZIP    │
│     总大小: 85.6 MB                 │
└─────────────────────────────────────┘
4.4.3 任务卡片
┌─────────────────────────────────────┐
│  📦 压缩包_1234567890.zip    ✅ 已完成│
│     3 个文件                         │
│                                     │
│  ┌─────────────────────────────┐   │
│  │  💾 原始大小  🗜️ 压缩后  📉 压缩率│   │
│  │   85.6 MB    25.7 MB    70.0%  │   │
│  └─────────────────────────────┘   │
│                                     │
│  ┌───────────┐ ┌───────────┐       │
│  │ 📁 打开位置 │ │ 🗑️ 删除   │       │
│  └───────────┘ └───────────┘       │
└─────────────────────────────────────┘
4.4.4 设置卡片
┌─────────────────────────────────────┐
│  压缩格式                              │
│                                     │
│  ┌─────┐ ┌─────┐ ┌─────┐           │
│  │ ZIP │ │ RAR │ │ 7Z  │           │
│  └─────┘ └─────┘ └─────┘           │
│  ┌─────┐ ┌─────┐                   │
│  │ TAR │ │ GZ  │                   │
│  └─────┘ └─────┘                   │
└─────────────────────────────────────┘

┌─────────────────────────────────────┐
│  压缩级别                              │
│                                     │
│  ○ ⭕ 无压缩 - 仅打包不压缩            │
│  ○ ⚡ 快速 - 压缩速度快,压缩率低       │
│  ● ⚖️ 标准 - 平衡速度与压缩率          │
│  ○ 🗜️ 最大 - 压缩率最高,速度慢        │
└─────────────────────────────────────┘

五、核心功能实现

5.1 文件选择实现

void _toggleFileSelection(MockFile file) {
  setState(() {
    if (_selectedFiles.contains(file)) {
      _selectedFiles.remove(file);
    } else {
      _selectedFiles.add(file);
    }
  });
}

void _selectAll() {
  setState(() {
    _selectedFiles = List.from(_mockFiles);
  });
}

void _clearSelection() {
  setState(() {
    _selectedFiles.clear();
  });
}

5.2 压缩任务创建

Future<void> _startCompression() async {
  if (_selectedFiles.isEmpty) return;

  final task = CompressionTask(
    id: DateTime.now().millisecondsSinceEpoch.toString(),
    name: '压缩包_${DateTime.now().millisecondsSinceEpoch}${_settings.format.extension}',
    files: _selectedFiles.map((f) => f.name).toList(),
    settings: _settings,
    originalSize: _selectedFiles.fold(0, (sum, f) => sum + f.size),
    createdAt: DateTime.now(),
  );

  setState(() {
    _tasks.insert(0, task);
  });

  await _simulateCompression(task);
}

5.3 压缩进度模拟

Future<void> _simulateCompression(CompressionTask task) async {
  final random = Random();
  final compressionRatio = 0.3 + (task.settings.level.level / 10) * 0.4;

  for (int i = 0; i <= 100; i += 5) {
    await Future.delayed(const Duration(milliseconds: 100));
    if (!mounted) return;
    setState(() {
      final index = _tasks.indexWhere((t) => t.id == task.id);
      if (index != -1) {
        _tasks[index] = _tasks[index].copyWith(
          status: CompressionTaskStatus.compressing,
          progress: i / 100,
          compressedSize: (task.originalSize * (1 - compressionRatio * (i / 100))).toInt(),
        );
      }
    });
  }

  setState(() {
    final index = _tasks.indexWhere((t) => t.id == task.id);
    if (index != -1) {
      _tasks[index] = _tasks[index].copyWith(
        status: CompressionTaskStatus.completed,
        progress: 1,
        compressedSize: (task.originalSize * (1 - compressionRatio)).toInt(),
        completedAt: DateTime.now(),
      );
    }
  });
}

5.4 压缩率计算

class CompressionTask {
  final int originalSize;
  final int compressedSize;
  
  double get compressionRatio =>
      originalSize > 0 ? (1 - compressedSize / originalSize) * 100 : 0;
}

5.5 设置存储实现

class CompressionStorage {
  static const String _settingsKey = 'compression_settings';

  static Future<void> saveSettings(CompressionSettings settings) async {
    final prefs = await SharedPreferences.getInstance();
    await prefs.setStringList(_settingsKey, [
      settings.format.index.toString(),
      settings.level.index.toString(),
      settings.includeSubfolders.toString(),
      settings.preserveStructure.toString(),
      settings.encryptNames.toString(),
    ]);
  }

  static Future<CompressionSettings> loadSettings() async {
    final prefs = await SharedPreferences.getInstance();
    final data = prefs.getStringList(_settingsKey);
    if (data == null || data.length < 5) return const CompressionSettings();
    return CompressionSettings(
      format: CompressionFormat.values[int.tryParse(data[0]) ?? 0],
      level: CompressionLevel.values[int.tryParse(data[1]) ?? 2],
      includeSubfolders: data[2] == 'true',
      preserveStructure: data[3] == 'true',
      encryptNames: data[4] == 'true',
    );
  }
}

六、交互设计

6.1 文件压缩流程

任务页面 任务管理器 压缩页面 用户 任务页面 任务管理器 压缩页面 用户 loop [压缩过程] 选择文件 更新选择状态 显示选中数量 点击压缩按钮 创建压缩任务 添加任务 开始压缩 更新进度 显示进度条 完成压缩 显示压缩结果

6.2 任务管理流程

压缩中

已完成

打开位置

删除任务

等待中

失败

查看任务列表

任务状态

显示进度条

等待完成

显示结果

用户操作

打开文件目录

移除任务

等待执行

显示错误

重试或删除

6.3 设置修改流程

选择格式

选择级别

切换开关

点击密码

查看设置

修改格式

修改级别

修改选项

设置密码

保存设置


七、扩展功能规划

7.1 后续版本规划

2024-01-07 2024-01-14 2024-01-21 2024-01-28 2024-02-04 2024-02-11 2024-02-18 2024-02-25 2024-03-03 2024-03-10 2024-03-17 2024-03-24 2024-03-31 基础UI框架 文件选择功能 压缩模拟功能 真实压缩实现 解压功能开发 批量任务优化 云存储支持 文件预览功能 分卷压缩功能 V1.0 基础版本 V1.1 增强版本 V1.2 进阶版本 文件压缩工具开发计划

7.2 功能扩展建议

7.2.1 真实压缩实现

压缩功能:

  • 集成archive库实现真实压缩
  • 支持多种压缩算法
  • 大文件分片压缩
  • 断点续传支持
7.2.2 解压功能

解压功能:

  • 自动识别压缩格式
  • 选择性解压文件
  • 解压进度显示
  • 解压路径选择
7.2.3 高级功能

高级功能:

  • 分卷压缩
  • 自解压文件创建
  • 压缩包修复
  • 文件校验

八、注意事项

8.1 开发注意事项

  1. 大文件处理:注意内存管理,避免一次性加载大文件

  2. 进度更新:合理控制进度更新频率,避免UI卡顿

  3. 错误处理:完善的错误捕获和用户提示

  4. 权限管理:确保文件读写权限正确获取

  5. 后台任务:长时间压缩任务支持后台执行

8.2 常见问题

问题 原因 解决方案
压缩失败 权限不足 检查文件读写权限
进度卡住 文件过大 使用流式处理
内存溢出 一次性加载 分片处理大文件
格式不支持 库限制 提示用户更换格式
密码错误 加密算法 检查密码设置

8.3 使用技巧

🗜️ 文件压缩工具使用技巧 🗜️

格式选择

  • 通用场景选ZIP格式
  • 高压缩率选RAR或7Z
  • 仅打包选TAR格式
  • 单文件压缩选GZ

级别选择

  • 临时文件用快速级别
  • 日常使用用标准级别
  • 长期存储用最大级别
  • 快速打包用无压缩

安全设置

  • 敏感文件设置密码
  • 启用文件名加密
  • 使用强密码
  • 定期更换密码

九、运行说明

9.1 环境要求

环境 版本要求
Flutter SDK >= 3.0.0
Dart SDK >= 2.17.0
鸿蒙OS API 21+
Web浏览器 Chrome 90+

9.2 运行命令

# 查看可用设备
flutter devices

# 运行到Web服务器
flutter run -d web-server -t lib/main_file_compression.dart --web-port 8206

# 运行到鸿蒙设备
flutter run -d 127.0.0.1:5555 lib/main_file_compression.dart

# 代码分析
flutter analyze lib/main_file_compression.dart

十、总结

文件压缩工具是一款专业的文件压缩与解压管理应用,支持ZIP、RAR、7Z、TAR、GZ五种主流压缩格式,满足不同场景的压缩需求。应用提供无压缩、快速、标准、最大四种压缩级别,用户可根据实际需求灵活选择。

核心功能涵盖文件选择、压缩格式、压缩级别、批量处理、进度显示、压缩统计、密码保护、设置持久化八大模块。用户可以批量选择文件、设置压缩参数、实时查看压缩进度,实现高效的文件压缩管理。

应用采用 Material Design 3 设计规范,以深邃的紫色为主色调,象征专业与高效。通过本应用,希望能够帮助用户高效管理文件存储空间,提升文件管理效率。

文件压缩工具——让文件管理更高效


Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐