老孟导读:Flutter 中获取文件路径,我们都知道使用 path_provider,但对其目录对含义不是很清楚,此文介绍 Android、iOS 系统的文件目录,不同场景下建议使用的目录。

不同的平台对应的文件系统是不同的,比如文件路径,因此 Flutter 中获取文件路径需要原生支持,原生端通过 MethodChannel 传递文件路径到 Flutter,如果没有特殊的需求,推荐大家使用 Google 官方维护的插件 path_provider

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

Github 地址:https://github.com/flutter/plugins/tree/master/packages/path_provider/path_provider

添加依赖

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

dependencies:path_provider: ^1.6.14

执行命令:

flutter pub get

文件路径

path_provider(版本:1.6.14)提供了8个方法获取不同的文件路径,目前 Flutter(Flutter 1.20.1 • channel stable )只发布了正式版本的 Android 和 iOS,因此下面仅介绍 Android 和 iOS 平台的文件路径。

  • getTemporaryDirectory

    临时目录,适用于下载的缓存文件,此目录随时可以清除,此目录为应用程序私有目录,其他应用程序无法访问此目录。

    Android 上对应getCacheDir

    iOS上对应NSCachesDirectory

  • getApplicationSupportDirectory

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

    将此文件用于您不想向用户公开的文件。 您的应用不应将此目录用于存放用户数据文件。

    在iOS上,对应NSApplicationSupportDirectory ,如果此目录不存在,则会自动创建。 在Android上,对应getFilesDir

  • getLibraryDirectory

    应用程序可以在其中存储持久性文件,备份文件以及对用户不可见的文件的目录路径,例如storage.sqlite.db。

    在Android上,此函数抛出[UnsupportedError]异常,没有等效项路径存在。

  • getApplicationDocumentsDirectory

    应用程序可能在其中放置用户生成的数据或应用程序无法重新创建的数据的目录路径。

    在iOS上,对应NSDocumentDirectory API。 如果数据不是用户生成的,考虑使用[getApplicationSupportDirectory]。

    在Android上,对应getDataDirectory API。 如果要让用户看到数据,请考虑改用[getExternalStorageDirectory]。

  • getExternalStorageDirectory

    应用程序可以访问顶级存储的目录的路径。由于此功能仅在Android上可用,因此应在发出此函数调用之前确定当前操作系统。

    在iOS上,此功能会引发[UnsupportedError]异常,因为无法在应用程序的沙箱外部访问。

    在Android上,对应getExternalFilesDir(null)

  • getExternalCacheDirectories

    存储特定于应用程序的外部缓存数据的目录的路径。 这些路径通常位于外部存储(如单独的分区或SD卡)上。 电话可能具有多个可用的存储目录。 由于此功能仅在Android上可用,因此应在发出此函数调用之前确定当前操作系统。 在iOS上,此功能会抛出UnsupportedError,因为这是不可能的在应用程序的沙箱外部访问。

    在Android上,对应Context.getExternalCacheDirs()或API Level 低于19的Context.getExternalCacheDir()

  • getExternalStorageDirectories

    可以存储应用程序特定数据的目录的路径。 这些路径通常位于外部存储(如单独的分区或SD卡)上。 由于此功能仅在Android上可用,因此应在发出此函数调用之前确定当前操作系统。 在iOS上,此功能会抛出UnsupportedError,因为这是不可能的在应用程序的沙箱外部访问。 在Android上,对应Context.getExternalFilesDirs(String type)或API Level 低于19的Context.getExternalFilesDir(String type)

  • getDownloadsDirectory

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

如果没有 Android 或者 iOS开发经验,看完上面的说明应该是一脸懵逼的,这么多路径到底用哪个?有什么区别?下面从 Android 和 iOS 平台的角度介绍其文件路径,最后给出路径使用的建议以及使用过程中需要注意的事项。

Android 文件存储

Android 文件存储分为内部存储外部存储

内部存储

用于保存应用的私有文件,其他应用无法访问这些数据,创建的文件在此应用的包名目录下,没有 root 权限 的手机无法在手机的 文件管理 应用中看到此目录,不过可以通过 Android Studio 工具查看,路径为:data/data/包名:

看下包名下具体的目录结构:

  • cache 目录:对应 getTemporaryDirectory 方法,用于缓存文件,此目录随时可能被系统清除。
  • files 目录:对应 getApplicationSupportDirectory 方法。
  • code_cache:此目录存储 Flutter 相关代码和资源。
    • flutter_engine/skia:Flutter 渲染引擎。
    • flutter_guidePVWGWK/flutter_guide/build/flutter_assets:Flutter 资源文件。
  • shared_prefs: SharePreferences 的默认路径。
  • app_flutter:对应 getApplicationDocumentsDirectory方法。
  • app_flutter/dbName:使用 sqlite 的默认路径,sqlite 也可以指定位置。

SharePreferencessqlite 是两种保存数据的第三方插件。

内部存储的特点:

  • 安全性,其他应用无法访问这些数据。
  • 当应用卸载的时候,这些数据也会被删除,避免垃圾文件。
  • 不需要申请额外权限。
  • 存储的空间有限,此目录数据随时可能被系统清除,也可以通过 设置 中的 清除数据 可以清除此目录数据。
  • 国内特色,不同手机厂商对此目录做了不同的限制,比如总体大小限制、单个应用程序所占空间大小限制、清除数据策略不同等。

外部存储

外部存储可以通过手机的 文件管理 应用查看,

这里面有一个特殊的目录:Android/data/包名:

看到这个目录是不是觉得和内部存储目录非常相似,一个包名代表一个应用程序:

  • cache:缓存目录,对应 getExternalCacheDirectories 方法。
  • files:对应 getExternalStorageDirectories 方法。

此目录的特点:

  • 当应用卸载的时候,这些数据也会被删除,避免垃圾文件。
  • 不需要申请额外权限。
  • 空间大且不会被系统清除,通过 设置 中的 清除数据 可以清除此目录数据。
  • 用户可以直接对文件进行删除、导入操作。

外部存储除了 Android/data/ 目录,还有和此目录同级的目录,特点:

  • 所有应用程序均可访问。
  • 用户可以直接对文件进行删除、导入操作。
  • 需要申请读写权限

Android 官方对此目录的管理越来越严格, Android 11 系统已经开始强制执行分区存储,详情见:https://developer.android.com/preview/privacy/storage?hl=zh-cn

上面说了这么多,总结如下:

  • SharePreferencessqlite 数据建议存放在内部存储,插件已经帮我们完成了,无需手动处理。
  • 严格保密的数据,比如用户数据,建议存放在内部存储,对应 getApplicationSupportDirectory 方法。
  • 其余所有的数据建议存放 Android/data/包名/ ,对应 getExternalCacheDirectoriesgetExternalStorageDirectories 方法。

iOS 文件存储

iOS 文件存储相比 Android 要简单的多,因为 iOS 对用户隐私保护非常严格,每个 iOS 应用程序都有一个单独的文件系统,而且只能在对应的文件系统中进行操作,此区域被称为沙盒。

每个应用沙盒含有3个文件夹:Documents, Library 和 tmp:

  • Documents:应用程序数据文件写入到这个目录下。这个目录用于存储用户数据。保存应用程序的重要数据文件和用户数据文件等。iTunes 同步时会备份该目录,对应 getApplicationDocumentsDirectory 方法。
  • Library:对应 getLibraryDirectory 方法。
    • Caches:保存应用程序使用时产生的支持文件、缓存文件、日志文件等,比如下载的音乐,视频,SDWebImage缓存等。对应 getTemporaryDirectory 方法。
    • Preferences:包含应用程序的偏好设置文件,iCloud会备份设置信息。
    • Application Support:对应 getApplicationSupportDirectory 方法。
  • tmp:存放临时文件,不会被备份,而且这个文件下的数据有可能随时被清除的可能,按照官方说法每三天清理一次缓存数据。

path_provider 使用

import 'dart:io';import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';///
/// desc:
///class PathProviderDemo extends StatefulWidget {@override_PathProviderDemoState createState() => _PathProviderDemoState();
}class _PathProviderDemoState extends State<PathProviderDemo> {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;@overridevoid initState() {super.initState();setState(() {_tempDirectory = getTemporaryDirectory();_appSupportDirectory = getApplicationSupportDirectory();_appLibraryDirectory = getLibraryDirectory();_appDocumentsDirectory = getApplicationDocumentsDirectory();_externalStorageDirectory = getExternalStorageDirectory();_externalCacheDirectories = getExternalCacheDirectories();_externalStorageDirectories = getExternalStorageDirectories();_downloadDirectory = getDownloadsDirectory();});}Widget _buildDirectory(BuildContext context, AsyncSnapshot<Directory> snapshot) {Text text = const Text('');if (snapshot.connectionState == ConnectionState.done) {if (snapshot.hasError) {text = Text('Error: ${snapshot.error}');} else if (snapshot.hasData) {text = Text('path: ${snapshot.data.path}');} else {text = const Text('path unavailable');}}return Padding(padding: EdgeInsets.symmetric(horizontal: 16), child: text);}Widget _buildDirectories(BuildContext context, AsyncSnapshot<List<Directory>> snapshot) {Text text = const Text('');if (snapshot.connectionState == ConnectionState.done) {if (snapshot.hasError) {text = Text('Error: ${snapshot.error}');} else if (snapshot.hasData) {final String combined =snapshot.data.map((Directory d) => d.path).join(', ');text = Text('paths: $combined');} else {text = const Text('path unavailable');}}return Padding(padding: const EdgeInsets.symmetric(horizontal: 16), child: text);}Widget _buildItem(String title, Future<Directory> future) {return Column(crossAxisAlignment: CrossAxisAlignment.start,children: [Padding(padding: const EdgeInsets.symmetric(horizontal: 16),child: Text(title),),FutureBuilder<Directory>(future: future, builder: _buildDirectory),],);}Widget _buildItem1(String title, Future<List<Directory>> future) {return Column(crossAxisAlignment: CrossAxisAlignment.start,children: [Padding(padding: const EdgeInsets.symmetric(horizontal: 16),child: Text(title),),FutureBuilder<List<Directory>>(future: future,builder: _buildDirectories),],);}@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(),body: Center(child: ListView(itemExtent: 120,children: <Widget>[_buildItem('getTemporaryDirectory', _tempDirectory),_buildItem('getApplicationSupportDirectory', _appSupportDirectory),_buildItem('getLibraryDirectory', _appLibraryDirectory),_buildItem('getApplicationDocumentsDirectory', _appDocumentsDirectory),_buildItem('getExternalStorageDirectory', _externalStorageDirectory),_buildItem('getDownloadsDirectory', _downloadDirectory),_buildItem1('getExternalStorageDirectories',_externalStorageDirectories),_buildItem1('getExternalCacheDirectories',_externalCacheDirectories),],),),);}
}

Android 系统各个路径:

iOS 系统各个路径:

交流

交流

老孟Flutter博客(330个控件用法+实战入门系列文章):http://laomengit.com

欢迎加入Flutter交流群(微信:laomengit)、关注公众号【老孟Flutter】

etw系统provider事件较多_【Flutter 实战】文件系统目录相关推荐

  1. linux系统文件系统个目录介绍,关于linux的文件系统目录详细介绍

    首先我们回答一下最为宽泛的问题,什么是文件系统? 文件系统是对一个存储设备上的数据和元数据进行组织的机制.liuux的文件系统体系结构是一个对复杂系统进行抽象化的有趣例子,通过使用一组通用的API函数 ...

  2. 【Paper】2020_离散多智能体系统的事件触发二分一致性研究_刘雨欣

    文章目录 第 4 章 有向符号图下离散多智能体系统的事件触发二分一致性 4.3.1 示例一 4.3.2 示例二 系统 动态方程.控制输入及事件触发条件分别如式(2.1).(3.1)及式(3.6)所示. ...

  3. 系统架构师学习笔记_第六章(下)_连载

    系统架构师学习笔记_第六章(下)_连载 6.3 基于 UML 的软件开发过程 6.3.1  开发过程概述 UML 是独立于软件开发过程的,能够在几乎任何一种软件开发过程中使用.迭代的渐进式软件开发过程 ...

  4. 黑苹果系统坏了如何恢复_黑苹果macOS系统U盘版/恢复版基础安装教程

    写在前面 本文最后更新:2020年7月17日 本文是一篇黑苹果安装基础教程,内容比较入门.安装黑苹果,相信谁都不敢说自己能100%解决所有问题.如果本文未能解决你的问题,请见谅.本文主要介绍两种安装方 ...

  5. pb9 调用系统语音_成都电销系统一个月多少钱_选择灵狐传媒_收费透明

    灵狐传媒表示:成都电销系统一个月多少钱_选择灵狐传媒_收费透明,在成都想要找一家专业的电销系统,今天小编带您看看该怎么选择吧,和研发实践,融合互联网.云计算及人工智能.通信.大数据等技术,研发推出了以 ...

  6. 玉柴spn码故障对照表_BOSCH共轨系统EDC7_V47故障码列表_发布(含SPN和FMI).pdf

    BOSCH共轨系统EDC7_V47故障码列表_发布(含SPN和FMI) 玉柴 BOSCH 共轨系统 EDC7_V47 故障列表 故障路径 故障描述 故障码 故障闪码 SPN FMI 空调请求开关信号故 ...

  7. 升鲜宝V2.0_生鲜配送行业,对生鲜配送行业的思考及对系统流程开发的反思_升鲜宝生鲜配送系统_15382353715_余东升...

    升鲜宝V2.0_生鲜配送行业,对生鲜配送行业的思考及对系统流程开发的反思_升鲜宝生鲜配送系统_15382353715_余东升 -----生鲜配送行业现状及存在问题----- 1.  从业者整体素质偏低 ...

  8. QQ会员抽奖系统引流源码_适合引流,营销,推广

    简介: 今天分享一款qq会员抽奖系统源码,客户抽中QQ会员,提示需要分享到6个群后才能领取, 分享群后直接跳到自己想让加的群,纯暴力引流,适合引流,营销,推广:本程序无需后台. 安装步骤: 1.准备好 ...

  9. JavaEE项目实战(OA系统)之十八_流程审批之一

    JavaEE项目实战(OA系统)之十八_流程审批之一 下面介绍OA系统的另一模块:流程审批. OA系统推崇的是无纸化办公,因此各项事务的流程审批是OA系统的一大类应用. 下面,我们来设计流程审批的数据 ...

最新文章

  1. 聊聊大麦网UWP版的首页顶部图片联动效果的实现方法
  2. GIT将本地项目上传到Github(两种简单、方便的方法)
  3. 怎么把自己建的墙拆掉_新房阳台栏杆要不要拆掉?后悔我家装修太早!
  4. python 测试multiprocessing多进程
  5. linux内核之kfifo队列
  6. 计算机三级考试监控回放,09年计算机三级辅导:禁用Vista下的硬盘监控警告
  7. 优化网站设计:减少DOM元素的数量
  8. SharedMaterial的一些问题
  9. 数值分析期末考试复习(逼近问题)
  10. 新手降NAT网络第十步曲,小编提供思路。
  11. git log 日期格式
  12. 《Redis视频教程》(p21)
  13. JS~Boxy和JS模版实现一个标准的消息提示框
  14. git push报错: Push rejected
  15. C++智能指针与类型转换
  16. Windows下IE浏览器文件下载
  17. 如何给div加遮罩?
  18. 显示器是个人计算机上的一个重要输出设备,东大17秋学期《计算机应用基础》在线作业123满分答案...
  19. WinSnap中文版v5.3.6-屏幕截图工具
  20. t-io 入门篇(三)即时消息发送demo学习

热门文章

  1. 一目了然了解JAVA集合体系
  2. Java Exception
  3. C# webform上传图片并生成缩略图
  4. 如何在Form中使用键弹性域(Key Flexfield)
  5. Makefile所有内嵌函数
  6. Objective-C 什么是类
  7. Moss/Sharepoint 一些很重要的API备忘
  8. MATLAB【七】———— matlab 高斯核使用,超像素图像模拟,矩阵转图像,深度相机模型实践实现
  9. Linux时间转化方法
  10. ASP.Net ViewState的实现