Flutter 获取文件缓存及清理缓存

前言:项目中我们用到 SharedPreferences 做本地化存储的场景更多,也有些同学会用到 mmkv 。但偶尔也有获取缓存大小,清理缓存,写入读取文件的需求。此篇意在分享如何用flutter官方插件 path_provider 实现上述功能。

准备工作:

  • 导入 path_provider 库, pubspec.yaml 文件内导入,以 pub.dev 的最新版本为准
  • path_provider: ^1.6.24
    
  • 创建storage.dart文件,
  • import 'package:path_provider/path_provider.dart';
    CacheManager
    class CacheManager {
    
    1. 递归计算文件、文件夹的大小
    static Future<double> getTotalSizeOfFilesInDir(
          final FileSystemEntity file) async {
        if (file is File) {
          int length = await file.length();
          return double.parse(length.toString());
        if (file is Directory) {
          final List<FileSystemEntity> children = file.listSync();
          double total = 0;
          if (children != null)
            for (final FileSystemEntity child in children)
              total += await getTotalSizeOfFilesInDir(child);
          return total;
        return 0;
    
    2.缓存大小格式转换
      static String formatSize(double value) {
        if (null == value) {
          return '0';
        List<String> unitArr = List()..add('B')..add('K')..add('M')..add('G');
        int index = 0;
        while (value > 1024) {
          index++;
          value = value / 1024;
        String size = value.toStringAsFixed(2);
        return size + unitArr[index];
    
    3. 获取文件夹缓存大小示例
    getTemporaryDirectory 获取应用缓存目录,等同IOS的NSTemporaryDirectory和Android的getCacheDir方法 getApplicationSupportDirectory 应用程序可以在其中放置应用程序支持文件的目录的路径 getLibraryDirectory 应用程序可以在其中存储持久性文件,如sqlite),在Android上,此函数抛出[UnsupportedError]异常,没有等效项路径存在 getApplicationDocumentsDirectory 获取应用文件目录类似于Ios的NSDocumentDirectory和Android上的 AppData目录 getExternalStorageDirectory 存储卡,仅在Android平台可以使用
    static Future<double> loadApplicationCache() async {
        //获取文件夹
        Directory docDirectory = await getApplicationDocumentsDirectory();
        Directory tempDirectory = await getTemporaryDirectory();
        double size = 0;
        if (docDirectory.existsSync()) {
          size += await getTotalSizeOfFilesInDir(docDirectory);
        if (tempDirectory.existsSync()) {
          size += await getTotalSizeOfFilesInDir(tempDirectory);
        return size;
    
    4.删除文件夹下所有文件、或者单一文件
     static Future<Null> deleteDirectory(FileSystemEntity file) async {
        if (file is Directory) {
          final List<FileSystemEntity> children = file.listSync();
          for (final FileSystemEntity child in children) {
              await deleteDirectory(child);
              await child.delete();
    
    5.删除部分文件夹缓存示例
      /// 删除缓存
      static void clearApplicationCache() async {
        Directory docDirectory = await getApplicationDocumentsDirectory();
        Directory tempDirectory = await getTemporaryDirectory();
        if (docDirectory.existsSync()) {
          await deleteDirectory(docDirectory);
        if (tempDirectory.existsSync()) {
          await deleteDirectory(tempDirectory);
    
    6.将文件写入指定路径文件夹
     /// 将数据内容写入doc文件夹里,如果不传direcName,默认存doc文件夹
      /// fileName: 文件名
      /// notes 要存储的内容
      /// direcName 文件夹名字,如分类,首页,购物车,我的等。可不传
      static void writeToFile(String fileName, String notes,
          {String direcName}) async {
        //获取doc路径
        Directory documentsDir = await getApplicationDocumentsDirectory();
        if (!documentsDir.existsSync()) {
          documentsDir.createSync();
        //用户文件夹,如果有uid,用uid见文件夹,没有建tourist
        String userId = LoginManager.uid;
        if (userId == null) {
          userId = "tourist";
        String userFileDirec = '${documentsDir.path}/$userId';
        documentsDir = Directory(userFileDirec);
        if (!documentsDir.existsSync()) {
          documentsDir.createSync();
        //功能文件夹
        if (direcName != null) {
          String path = '${documentsDir.path}/$direcName';
          documentsDir = Directory(path);
        if (!documentsDir.existsSync()) {
          documentsDir.createSync();
        String documentsPath = documentsDir.path;
        File file = new File('$documentsPath/$fileName');
        if (!file.existsSync()) {
          file.createSync();
        //写入文件