flutter

Flutter开发之文件的解压缩

2019-12-31  本文已影响0人  我打小就帅

文件的解压缩在实际开发当中基本也会有用到,比如说将本地文件压缩上传这些操作基本时常会有,不要问我为什么要解压缩,都快2020了##

下面直接看看代码的基本实现吧
首次第一部还是导入第三方

  fluttertoast: ^3.0.4 #toast提示
  path_provider: ^1.1.0 #文件路径管理
  archive: ^2.0.10 #解/压缩
  permission_handler: ^3.1.0 #permission

然后看看下面的使用示例

import 'dart:io';
 
import 'package:flutter/material.dart';
import 'package:archive/archive.dart';
import 'package:archive/archive_io.dart';
import 'package:path_provider/path_provider.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:permission_handler/permission_handler.dart';

class FileZipDemo extends StatefulWidget{
  @override
  State<StatefulWidget> createState() {
    // TODO: implement createState
    return _FileZipDemoState();
  }

}

class _FileZipDemoState extends State<FileZipDemo> {

  String _zipRootPath = "空文件";
  TextEditingController _zipNameController=new TextEditingController();
  TextEditingController _unZipNameController=new TextEditingController();
  int _tag;//0表示解压、1表示压缩

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    _getRootPath();
  }

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Scaffold(
      appBar: AppBar(
        centerTitle: true,
        title: Text("文件解/压缩"),
      ),
      body: Container(
        padding: EdgeInsets.all(8),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            Text("手机存储根目录:"),
            Text(_zipRootPath,),
            Padding(padding: EdgeInsets.only(top: 20)),
            Text("1、输入手机存储根目录下的需要解压的文件名称"),
            _getZipNameView(0),
            _getQueryBtnView(0),
            Padding(padding: EdgeInsets.only(top: 10)),
            Text("2、输入手机存储根目录下的需要压缩的文件名称"),
            _getZipNameView(1),
            _getQueryBtnView(1),
          ],
        ),
      ),
    );
  }

  _getZipNameView(int tag) {
    return TextField(
      keyboardType: TextInputType.text,
      style: TextStyle(color: Color(0xFF888888)),
      controller: tag==0?_unZipNameController:_zipNameController,
      decoration: InputDecoration(
        hintText: tag==0?"压缩包文件名称 格式如:test.zip":"待压缩文件名称 格式如:test",
        hintStyle: TextStyle(color: Color(0xFF888888)),
        contentPadding: EdgeInsets.only(left: 10,right: 10,bottom: 10,top: 10),
        border: OutlineInputBorder(
          borderRadius: BorderRadius.circular(8.0),
        ),
      ),
    );
  }
  _getQueryBtnView(int tag){
    return Container(
      alignment: Alignment.center,
      child: RaisedButton(
          onPressed: (){
            tag==0?_unZip():_zip();
          },
          child: Text(tag==0?"解压":"压缩",style: TextStyle(color: Colors.white,fontSize: 18),),
          color: Colors.orange,
          shape: RoundedRectangleBorder(
            borderRadius: BorderRadius.circular(5),
          )
      ),
    );
  }

  ///解压
  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;
    }
    PermissionStatus permission = await PermissionHandler().checkPermissionStatus(PermissionGroup.storage);
    print(permission);
    Map<PermissionGroup, PermissionStatus> permissions =
    await PermissionHandler().requestPermissions([PermissionGroup.storage]);

    // 从磁盘读取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);
      }
    }
    Fluttertoast.showToast(msg: "解压成功");
    print("解压成功");
  }

  ///压缩
  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;
    }
    PermissionStatus permission = await PermissionHandler().checkPermissionStatus(PermissionGroup.storage);
    print(permission);
    Map<PermissionGroup, PermissionStatus> permissions =
    await PermissionHandler().requestPermissions([PermissionGroup.storage]);

    // 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();
  }

  void _getRootPath()async {
    String pathStr = (await getExternalStorageDirectory()).path;
    setState(() {
      _zipRootPath = pathStr;
    });
  }


}

总结就那么几步
1,获取文件路径,这里注意下文件的格式
2,调用接口进行判断和解压缩
3,记得在实际开发中加入加载框一些动画,提高用户交互的流畅性

2019即将过去噜,又是艰辛的一年,不惧伤痛,但愿快乐着

上一篇 下一篇

猜你喜欢

热点阅读