Flutter-文件系统目录和文件读写

不同的平台对应的文件系统是不同的,比如文件路径,所以 Flutter 中获取文件路径需要原生端通过 Channel传递文件路径这样也是不方便的,这里推荐大家使用官方的插件path_provider来实现这个功能。

文件系统目录

不同的平台对应的文件系统是不同的,比如文件路径,这里推荐大家使用 Google 官方维护的插件 path_provider

添加依赖

在项目的 pubspec.yaml 文件中添加依赖:

dependencies:
  path_provider: ^2.0.8
复制代码

执行命令:

flutter pub get
复制代码

文件路径

path_provider 提供了8个方法获取不同的文件路径, 分别是:

  • getTemporaryDirectory:设备上未备份的临时目录的路径,适合存储下载文件的缓存,此目录随时可以清除。iOS 上对应 NSCachesDirectory获取的目录,Android 对应 getCacheDir。

  • getApplicationSupportDirectory:应用程序可以在其中放置应用程序支持文件的目录的路径。

将此选项用于不希望暴露给用户的文件。你的应用不应该使用此目录存放用户数据文件。iOS 等同于 NSApplicationSupportDirectory API 获取,并且如果该目录不存在,则自动创建。 Android 等同于 getFilesDir这个目录。

  • getLibraryDirectory:应用程序可以存储持久文件的目录,备份文件以及对用户不可见的文件的目录路径,例如sqlite.db。在 Android 上,此函数抛出 UnsupportedError 异常,没有等效的路径存在。

  • getApplicationDocumentsDirectory:应用程序可能放置数据的目录的路径或应用程序无法重新创建的数据的目录路径。在iOS上,对应NSDocumentDirectory API。如果数据不是用户生成的,考虑使用getApplicationSupportDirectory。在Android上,对应getDataDirectory API。 如果要让用户看到数据,请考虑改用getExternalStorageDirectory

  • getExternalStorageDirectory:应用程序可以访问顶级存储的目录的路径。由于此功能仅在Android上可用,因此应在发出此函数调用之前确定当前操作系统。在iOS上,此功能会引发UnsupportedError异常,因为无法在应用程序的沙箱外部访问。在Android上,对应getExternalFilesDir(null)

  • getExternalCacheDirectories:存储特定于应用程序的外部缓存数据的目录的路径。 这些路径通常位于外部存储(如单独的分区或SD卡)上,此功能只能在Android上访问。

  • getExternalStorageDirectories:可以存储应用程序特定数据的目录的路径。 这些路径通常位于外部存储(如单独的分区或SD卡)上。 由于此功能仅在Android上可用。

  • getDownloadsDirectory:存储下载文件的目录的路径,这通常仅与台式机操作系统有关。 在Android和iOS上,此函数将引发UnsupportedError异常。

iOS 文件存储

iOS本地化存储的数据保存在沙盒中。为了保证系统安全,iOS每个应用程序在安装时,会创建属于自己的沙盒文件(存储空间)。iOS的沙盒目录:

  • Documents:iTunes会备份该目录。一般用来存储需要持久化的数据。对应getApplicationDocumentsDirectory方法
  • Library/Caches:缓存,iTunes不会备份该目录。内存不足时会被清除,应用没有运行时,可能会被清除,。一般存储体积大、不需要备份的非重要数据。对应 getTemporaryDirectory 方法
  • Library/Preference:iTunes同会备份该目录,可以用来存储一些偏好设置。
  • tmp:iTunes不会备份这个目录,用来保存临时数据,应用退出时会清除该目录下的数据。

Flutter 获取缓存文件路径

void getTempDir() async {
  Directory tempDir = await getTemporaryDirectory();
  print(tempDir.path);
}
复制代码

flutter: /Users/zhouCandy/Library/Developer/CoreSimulator/Devices/9853F2BA-DC9C-4E8C-9C4D-B2C00BFA83ED/data/Containers/Data/Application/CF9BDC93-0F20-4D75-88CC-4C2AC205B532/Library/Caches

iOS 获取缓存文件的路径

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);

NSString *cachesDir = [paths objectAtIndex:0];
复制代码

/Users/zhouCandy/Library/Developer/CoreSimulator/Devices/9853F2BA-DC9C-4E8C-9C4D-B2C00BFA83ED/data/Containers/Data/Application/7F78738D-2F77-4654-83F2-8DB0B28ACA45/Library/Caches

可以看出对应原生和Flutter获取的路径是一样的

文件读写

path_provider 使用

这里实现了输入文本,保存文本的内容,然后读取出保存的内容及文件的路径,这里使用 iOS 模拟器测试

import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';
import 'dart:io';

class SaveDataPage extends StatefulWidget {
  const SaveDataPage({Key? key}) : super(key: key);

  @override
  _SaveDataPageState createState() => _SaveDataPageState();
}

class _SaveDataPageState extends State<SaveDataPage> {
  final _textFieldController = TextEditingController();
  var _saveString = '';

  //利用文件存储数据
  saveString() async {
    final file = await getFile('file.text');
    //写入字符串
    file.writeAsString(_textFieldController.value.text.toString());
  }

  //获取存在文件中的数据
  Future getString() async {
    final file = await getFile('file.text');
    var filePath  = file.path;
    print('${filePath}');
    setState(() {
      file.readAsString().then((String value) {
        _saveString = value +'\n文件存储路径:'+filePath;
      });
    });
  }

  //初始化文件路径
  Future<File> getFile(String fileName) async {
    //获取应用文件目录类似于iOS的NSDocumentDirectory和Android上的 AppData目录
    final fileDirectory = await getApplicationDocumentsDirectory();

    //获取存储路径
    final filePath = fileDirectory.path;

    //或者file对象(操作文件记得导入import 'dart:io')
    return File(filePath + "/"+fileName);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('数据存储'),
      ),
      body: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          const Text("文件存储", textAlign: TextAlign.center),
          TextField(
            controller: _textFieldController,
          ),
          MaterialButton(
            onPressed: saveString,
            child: const Text("存储"),
            color: Colors.cyan,
          ),
          MaterialButton(
            onPressed: getString,
            child: const Text("获取"),
            color: Colors.deepOrange,
          ),
          Text('存储的值为  $_saveString'),
        ],
      ),
    );
  }
}
复制代码

实际效果

截屏2021-12-10 下午3.09.31.png

以上就是关于如何去获取文件目录,以及如何进行文件的读写。

Guess you like

Origin juejin.im/post/7041365514416816159