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即将过去噜,又是艰辛的一年,不惧伤痛,但愿快乐着