Flutter文件压缩解压插件zipper的使用

Flutter文件压缩解压插件zipper的使用

zipper

将目录打包成单个文件。注意:Zipper 不生成 .zip 文件。😁

由波多黎各的 Radamés J. Valentín Reyes 开发。


功能目的

读取某个文件夹中的所有目录和文件,并将所有数据保存到一个单一的 .json 格式的文件中,之后可以提取该文件,同时保留文件结构和数据。它类似于 zip 的概念,但不包含压缩功能(至少目前没有),也不支持密码保护,生成的文件大小会显著增加,而且会占用大量内存。它的设计目标是处理单一文件的应用场景,而不是复杂的文件/文件夹结构。本库提供了创建和提取此类文件所需的所有函数。

注意:我没有创建生成 .zip 文件的库,因为我仍然不知道它是如何工作的。我使用 .json 创建了自己的文件结构。


示例

导入库

import 'package:zipper/zipper.dart' as Zipper;
import 'dart:io';

将所有内容合并到一个文件(打包非 zip 文件)

String sourceFolder = "C:/Users/valen_z1p5ic1/Pictures/UbisoftConnect";  // 源文件夹路径
String outputFile = "C:/Users/valen_z1p5ic1/Downloads/file_system.json";  // 输出文件路径
await Zipper.zip(
    outputFile: File(outputFile),  // 输出文件对象
    sourceDirectory: Directory(sourceFolder),  // 源文件夹对象
);

提取文件(解包非 zip 文件)

注意:overwrite = false 是默认值。

String sourceFilePath = "C:/Users/valen_z1p5ic1/Downloads/file_system.json";  // 源文件路径
String outputFolderPath = "C:/Users/valen_z1p5ic1/Downloads";  // 输出文件夹路径
await Zipper.unzip(
    sourceFile: File(sourceFilePath),  // 源文件对象
    outputDirectory: Directory(outputFolderPath),  // 输出文件夹对象
    overWrite: true,  // 可选参数,true 表示覆盖冲突的文件/文件夹名称
);

文件规格

该文件是一个普通的 .json 文件,具有以下标准化特性:

  • JSON 属性名是文件或文件夹的名称。
  • 如果属性值是一个整数列表(在 JavaScript 中为数组),则表示该属性名对应一个文件,列表中的每个数字代表文件中每个字节的值。
  • 如果属性值是一个 Map(JavaScript 对象),则表示该属性名对应一个文件夹/目录,内部的属性是其包含的子目录和文件。
  • 由于上述原因,此格式嵌套了 Maps(对象),因为它们代表子目录及其内容。

文件示例:

{
	"filename.extension" : [17,22,36......],
    "folder name" : {}
}

错误捕获

枚举不同的错误类型。这是一种简单且充满错误的方法来识别错误类型。ZipperError.errorParsing 是唯一能以 100% 确定性表示错误的枚举,其他可能不是。

try {
    String sourceFilePath = "C:/Users/valen_z1p5ic1/Downloads/file_system.json";
    String outputFolderPath = "C:/Users/valen_z1p5ic1/Downloads";
    await Zipper.unzip(
        sourceFile: File(sourceFilePath),
        outputDirectory: Directory(outputFolderPath),
        overWrite: true, // 可选参数,true 表示覆盖冲突的文件/文件夹名称
    );
} catch (error) {
    if (error == ZipperError.errorParsing) {
        // 处理解析错误
    } else if (error == ZipperError.outOfRAM) {
        // 处理内存不足错误
    } else {
        // 其他错误处理
    }
}

更多关于Flutter文件压缩解压插件zipper的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter文件压缩解压插件zipper的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,zipper 是一个用于文件压缩和解压的插件。它支持常见的压缩格式,如 ZIP 和 7z。以下是如何使用 zipper 插件进行文件压缩和解压的基本步骤。

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 zipper 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  zipper: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 来安装依赖。

2. 导入插件

在你的 Dart 文件中导入 zipper 插件:

import 'package:zipper/zipper.dart';

3. 压缩文件

使用 Zipper.zip 方法来压缩文件或文件夹。以下是一个示例:

void compressFiles() async {
  try {
    // 要压缩的文件或文件夹路径
    List<String> filesToCompress = [
      '/path/to/file1.txt',
      '/path/to/file2.txt',
    ];

    // 压缩后的文件路径
    String outputZipPath = '/path/to/output.zip';

    // 调用压缩方法
    await Zipper.zip(files: filesToCompress, outputFile: outputZipPath);

    print('文件压缩成功: $outputZipPath');
  } catch (e) {
    print('文件压缩失败: $e');
  }
}

4. 解压文件

使用 Zipper.unzip 方法来解压文件。以下是一个示例:

void extractFiles() async {
  try {
    // 要解压的压缩文件路径
    String zipFilePath = '/path/to/output.zip';

    // 解压后的目标文件夹路径
    String outputDirectory = '/path/to/extracted_files';

    // 调用解压方法
    await Zipper.unzip(zipFile: zipFilePath, destinationDir: outputDirectory);

    print('文件解压成功: $outputDirectory');
  } catch (e) {
    print('文件解压失败: $e');
  }
}

5. 处理权限

在 Android 和 iOS 上,你可能需要处理文件读写权限。确保在 AndroidManifest.xmlInfo.plist 中添加相应的权限声明。

Android

AndroidManifest.xml 中添加以下权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

iOS

Info.plist 中添加以下权限:

<key>NSPhotoLibraryUsageDescription</key>
<string>We need access to your photo library to save files.</string>
<key>NSMicrophoneUsageDescription</key>
<string>We need access to your microphone to record audio.</string>
<key>NSCameraUsageDescription</key>
<string>We need access to your camera to take photos.</string>

6. 运行代码

现在你可以调用 compressFilesextractFiles 方法来压缩和解压文件了。

注意事项

  • 确保文件路径和目录路径是正确的。
  • 处理可能出现的异常,例如文件不存在或权限不足。
  • 在实际应用中,可能需要使用 path_provider 插件来获取应用目录路径,而不是硬编码路径。

示例代码

以下是一个完整的示例代码:

import 'package:flutter/material.dart';
import 'package:zipper/zipper.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Zipper Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              ElevatedButton(
                onPressed: compressFiles,
                child: Text('压缩文件'),
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: extractFiles,
                child: Text('解压文件'),
              ),
            ],
          ),
        ),
      ),
    );
  }

  void compressFiles() async {
    try {
      List<String> filesToCompress = [
        '/path/to/file1.txt',
        '/path/to/file2.txt',
      ];
      String outputZipPath = '/path/to/output.zip';
      await Zipper.zip(files: filesToCompress, outputFile: outputZipPath);
      print('文件压缩成功: $outputZipPath');
    } catch (e) {
      print('文件压缩失败: $e');
    }
  }

  void extractFiles() async {
    try {
      String zipFilePath = '/path/to/output.zip';
      String outputDirectory = '/path/to/extracted_files';
      await Zipper.unzip(zipFile: zipFilePath, destinationDir: outputDirectory);
      print('文件解压成功: $outputDirectory');
    } catch (e) {
      print('文件解压失败: $e');
    }
  }
}
回到顶部