Javascript is required
Flutter外部文件操作

Flutter文件存储操作

提供给程序一个路径信息。 使用插件path_provider来获取Path

$>warning 环境

Flutter 1.22.0
Dart 2.10.0

文件

IOS文件存储

每个应用对应一个单独的文件系统。


- Documents

  应用程序数据文件写入到这个目录下。这个目录用于存储用户数据。保存应用程序的重要数据文件和用户数据文件等。

- Library

- Caches

- Prefenerences

- Application Support

- tmp

存放临时文件,不会被备份

主要涉及的类

  • Directory
  • File

操作


final directory = await getApplicationDocumentsDirectory();
final path = directory.path;

获取临时文件路径

getTemporaryDirectory().then((value) => print(value));

>>> '/var/mobile/Containers/Data/Application/EAE0BE0B-9AE2-4A42-9693-295BD398BA73/Library/Caches'

获取应用支持目录

getApplicationSupportDirectory().then((value) => print(value));

>>> '/var/mobile/Containers/Data/Application/EAE0BE0B-9AE2-4A42-9693-295BD398BA73/Library/Application Support'

获取应用文件目录

getApplicationDocumentsDirectory().then((value) => print(value));

>>> '/var/mobile/Containers/Data/Application/EAE0BE0B-9AE2-4A42-9693-295BD398BA73/Documents'

获取应用持久存储目录

IOS

getLibraryDirectory().then((value) => print(value));

Android

getExternalStorageDirectory().then((value) => print(value));
// 获取外部存储目录列表
getExternalStorageDirectories().then((value) => print(value));

总结

Future<Directory> _tempDirectory;
Future<Directory> _appSupportDirectory;
Future<Directory> _appLibraryDirectory;
Future<Directory> _appDocumentsDirectory;
Future<Directory> _externalStorageDirectory;
Future<List<Directory>> _externalStorageDirectories;
Future<List<Directory>> _externalCacheDirectories;
Future<Directory> _downloadDirectory;

_tempDirectory = getTemporaryDirectory();
_appSupportDirectory = getApplicationSupportDirectory();
_appLibraryDirectory = getLibraryDirectory();
_appDocumentsDirectory = getApplicationDocumentsDirectory();
_externalStorageDirectory = getExternalStorageDirectory();
_externalCacheDirectories = getExternalCacheDirectories();
_externalStorageDirectories = getExternalStorageDirectories();
_downloadDirectory = getDownloadsDirectory();

需要搭配Director和File等进行操作。

import 'dart:io';       // Directory所在的包
import 'dart:convert';

Directory对象

/// 属性
// String path 获取此目录的路径
print(dir.path);

// Uri 返回表示目录位置的uri
print(dir.uri);

// 父目录的Directory对象
print(dir.parent);

// absolute 返回一个绝对路径的Directory对象
print(dir.absolute);

// 判断是否是绝对路径
print(dir.isAbsolute);

File对象

/// 创建实例
new File('path');

/// 方法
// 打印一下file实例对象
print(file);   // File: 'assets\files\index.txt'

// 返回绝对路径的File实例
print(file.absolute); // File: 'C:\Users\Administrator.PW6NUH21X31RM79\Desktop\Dart\assets\files\index.txt'

// 获取文件路径
print(file.path); // assets\files\index.txt

// 是否是绝对路径
print(file.isAbsolute);  // fasle

// 获取父目录的Directory对象
print(file.parent);  // Directory: 'assets\files'

// 获取uri
print(file.uri);   // assets/files/index.txt

创建目录

可以通过.exists()判断目录是否存在。

create 方法有一个可选的 recursive 参数。其作用是,如果 recursive 为 false,那么只创建目录中最后一个文档夹,如果为 true,则会创建整个目录中所有不存在的文档夹。

// 根据路径字符创建目录对象
RaisedButton(
  onPressed: () async {
    final path = await getApplicationDocumentsDirectory();
    final directory = Directory(path.path+'/base/');
    print(path.path);
    directory.create(recursive: true);
  },
  child: Text('创建目录'),
),

也可以使用如下方式创建目录,从而省略 await 关键字

directory.createSync();

读取文档

final file = File("_path");
final String content = await file.readAsString(); //

写文件

// final file = File('');
// await file.writeAsString(DateTime.now().toString());

RaisedButton(
  onPressed: () async{
    final path = await getApplicationDocumentsDirectory();
    final file = new File(path.path+'/hi.txt');
    print(file.path);
    file.writeAsString('Hello World');
  },
  child: Text('创建文件'),
),

如何在IOS文件中显示

在“文件”应用中有一个名为“在此iPhone中”的目录,但是如果我想显示在此处写入的数据怎么办?

打开info.plist 添加

<key>LSSupportsOpeningDocumentsInPlace</key>
<true/>
<key>UIFileSharingEnabled</key>
<true/>

参考

https://pub.flutter-io.cn/packages/path_provider