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