文件压缩工具


欢迎加入开源鸿蒙跨平台社区:
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 压缩格式定义

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

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 / WebAPI 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%压缩格式使用分布示例ZIPRAR7ZTARGZ

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 字体规范

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

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-072024-01-142024-01-212024-01-282024-02-042024-02-112024-02-182024-02-252024-03-032024-03-102024-03-172024-03-242024-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
鸿蒙OSAPI 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

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐