zip_util.dart 1.54 KB
import 'dart:io';

import 'package:archive/archive.dart';
import 'package:flutter/services.dart';

class ZipUtil {
  static Future<bool> extractZipFile(String zipFilePath, String extractPath) async {
    try {
      // 读取zip文件
      Uint8List bytes;
      if (zipFilePath.startsWith('assets/')) {
        // 读取 assets 中的文件
        final ByteData data = await rootBundle.load(zipFilePath);
        bytes = data.buffer.asUint8List();
      } else {
        // 读取本地文件
        final zipFile = File(zipFilePath);
        bytes = await zipFile.readAsBytes();
      }

      // 解压ZIP文件
      final archive = ZipDecoder().decodeBytes(bytes);

      // 创建解压目录
      final directory = Directory(extractPath);
      if (!(await directory.exists())) {
        await directory.create(recursive: true);
      }

      // 遍历并提取文件
      for (final file in archive) {
        final filename = file.name;
        if (file.isFile) {
          final data = file.content as List<int>;
          final outputFile = File('$extractPath/$filename');
          // 创建父目录
          await outputFile.create(recursive: true);
          // 写入文件内容
          await outputFile.writeAsBytes(data);
        } else {
          // 创建目录
          final dir = Directory('$extractPath/$filename');
          await dir.create(recursive: true);
        }
      }

      print('文件解压成功: $extractPath');
      return true;
    } catch (e) {
      print('文件解压失败: $e');
      return false;
    }
  }
}