前言
最近要用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 imageGitHub Demo地址:
https://github.com/ChessLuo/flutter_study_app
最后,个人觉得这是比较好的一个Flutter压缩插件,但是还是有很多缺陷的,如果要自己去实现一个插件的话,必须要适配Android、iOS;考虑到iOS端没啥经验,估计得折腾很久,有木有更好的轮子呢,欢迎各位留言,谢谢!
支持我的话可以关注下我的公众号,一起学习Android、小程序、跨平台开发~
image
网友评论