Flutter文件操作

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']); // xiaoming
print(json['age']); // 22
print(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';