介绍一个Flutter解压缩插件

作者: 程序猿在广东 | 来源:发表于2019-06-16 14:56 被阅读3次

    前言

    最近要用Flutter实现文件的解压功能,我第一时间就到网上搜索有木有比较成熟的轮子,因此凭我有限的搜索能力,最终还是找到了一个比较满意的解压缩插件,GitHub地址:

    https://github.com/brendan-duncan/archive

    说明

    按照官方说明,该插件适用用于编码和解码各种存档和压缩格式。目前解码支持以下格式:

    • Zip (Archive)

    • Tar (Archive)

    • ZLib [Inflate decompression]

    • GZip [Inflate decompression]

    • BZip2 [decompression]

      编码支持一下格式:

    • Zip (Archive)

    • Tar (Archive)

    • ZLib [Deflate compression]

    • GZip [Deflate compression]

    • BZip2 [compression]

    使用

    接下来我写了个demo简单使用了该插件,解压zip文件,和压缩成zip文件:

    1、解压文件,需指定解压文件的路径:

    ///解压
    void _unZip() async{
        if(_unZipNameController.text==null||_unZipNameController.text==""){
          Fluttertoast.showToast(msg: "压缩包文件名称不能为空!");
          return;
        }
        String zipFilePath = _zipRootPath+"/"+_unZipNameController.text ;
        if(!File(zipFilePath).existsSync()){
          Fluttertoast.showToast(msg: "压缩包文件不存在!");
          return;
        }
        // 从磁盘读取Zip文件。
        List<int> bytes = File(zipFilePath).readAsBytesSync();
        // 解码Zip文件
        Archive archive = ZipDecoder().decodeBytes(bytes);
    
        // 将Zip存档的内容解压缩到磁盘。
        for (ArchiveFile file in archive) {
          if (file.isFile) {
            List<int> data = file.content;
            File(_zipRootPath+"/"+file.name)
              ..createSync(recursive: true)
              ..writeAsBytesSync(data);
          } else {
            Directory(_zipRootPath+"/"+file.name)
              ..create(recursive: true);
          }
        }
        print("解压成功");
    }
    

    2、压缩文件:

     ///压缩
      void _zip() async{
        if(_zipNameController.text==null||_zipNameController.text==""){
          Fluttertoast.showToast(msg: "待压缩文件名称不能为空!");
          return;
        }
        String directory = _zipRootPath+"/"+_zipNameController.text;
        if(!Directory(directory).existsSync()){
          Fluttertoast.showToast(msg: "待压缩文件不存在!");
          return;
        }
        // Zip a directory to out.zip using the zipDirectory convenience method
        //使用zipDirectory方法将目录压缩到xxx.zip
        var encoder = ZipFileEncoder();
        encoder.zipDirectory(Directory(directory), filename: directory+".zip");
        Fluttertoast.showToast(msg: "压缩成功");
        //手动创建目录和单个文件的zip。
    //    encoder.create('out2.zip');
    //    encoder.addDirectory(Directory('out'));
    //    encoder.addFile(File('test.zip'));
    //    encoder.close();
      }
    

    3、也许这个插件没考虑到Android权限这一点吧,因此解压过程需要对文件操作,这时别忘了要在Android工程目录下的AndroidManifest.xml下添加权限:

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

    对于Android6.0以上的设备需要考虑到运行时权限。

    demo效果

    image image

    GitHub Demo地址:

    https://github.com/ChessLuo/flutter_study_app

    最后,个人觉得这是比较好的一个Flutter压缩插件,但是还是有很多缺陷的,如果要自己去实现一个插件的话,必须要适配Android、iOS;考虑到iOS端没啥经验,估计得折腾很久,有木有更好的轮子呢,欢迎各位留言,谢谢!

    支持我的话可以关注下我的公众号,一起学习Android、小程序、跨平台开发~

    image

    相关文章

      网友评论

        本文标题:介绍一个Flutter解压缩插件

        本文链接:https://www.haomeiwen.com/subject/kmlgfctx.html