path_provider获取应用存储路径
path_provider是flutter提供的一个获取应用存储路径的插件,它封装了统一的api来获取Android和ios两个平台的应用存储路径,提供的api如下:
- getTemporaryDirectory():获取应用临时文件夹,该文件夹用来保存应用的缓存,可以随时删除用于清缓存,对应于Android的getCacheDir()和ios的NSTemporaryDirectory();
- getApplicationDocumentsDirectory():获取应用安装路径,在应用被卸载的时候删除,对应Android的AppDate目录和iOS的NSDocumentDirectory目录;
- getExternalStorageDirectory():获取存储卡目录,仅支持Android;
我们通过File和Directory来创建文件和文件夹时首先要获取到应用的相关路径,不然会报错;
File/Directory操作文件/文件夹
File对象和Directory对象封装在dart:io中,使用时需要先引入该库:
import 'dart:io';创建文件/文件夹
// 创建一个文件夹Directory tempDir = await getTemporaryDirectory(); Directory directory = new Directory('${tempDir.path}/test');if (!directory.existsSync()) { directory.createSync(); print('文档初始化成功,文件保存路径为 ${directory.path}');}// 创建一个文件Directory tempDir = await getTemporaryDirectory(); File file = new File('${tempDir.path}/test.txt');if (!file.existsSync()) { file.createSync(); print('test.txt创建成功');}列出文件夹里的内容
Directory对象提供listSync()方法获取文件夹里的内容,该方法返回一个数组;
// 打印出test文件夹下文件的路径Directory tempDir = await getTemporaryDirectory(); Directory directory = new Directory('${tempDir.path}/test');directory.listSync().forEach((file) { print(file.path);});删除文件/文件夹
文件和文件夹都通过delete删除,delete异步,deleteSync同步;如果一个文件夹是非空的删除会报错,删除非空文件夹需要先清空该文件夹:
Directory directory = new Directory(path);if (directory.existsSync()) { List<FileSystemEntity> files = directory.listSync(); if (files.length > 0) { files.forEach((file) { file.deleteSync(); }); } directory.deleteSync();}读取/写入文件
File file = new File('${cache}/test.txt');// 读物文件内容String content = file.readAsString();print(content);// 写入文件file.writeAsString('文件内容');json文件读写
flutter对json序列化需要引入 dart:convert 库:
import 'dart:convert' as convert;通过jsonEncode/jsonDecode来转换json对象:
var json = { 'name': 'xiaoming', 'age': 22, 'address': 'hangzhou'}File jsonFile = new File('$cahce/test.json');// json文件写入jsonFile.writeAsString(convert.jsonEncode(json));// json文件读取var jsonStr = await jsonFile.readAsString();var json = convert.jsonDecode(jsonStr);print(json['name']); // xiaomingprint(json['age']); // 22print(json['address']); // hangzhou文件的拷贝
// 将test目录下的info.json复制到test2目录下的info2.json中File info1 = new File('$cache/test/info.json');info1.copySync('$cache/test2/info2.json');archive插件压缩文件
引入包archive包:
import 'package:archive/archive.dart';import 'package:archive/archive_io.dart';压缩:
var encode = ZipFileEncoder();encode.zipDirectory(path, filename: path + '.zip');encode.close();压缩前使用ZipFileEncoder先声明处理压缩的对象,调用该对象的zipDirectory方法压缩文件,该方法接受两个参数,第一个是要压缩文件/文件夹的路径,第二个是压缩包的保存路径;
解压:
List<int> bytes = File('test.zip').readAsBytesSync();Archive archive = ZipDecoder().decodeBytes(bytes);