Flutter相关

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

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

准备工作:

path_provider: ^1.6.24
import 'package:path_provider/path_provider.dart';
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. 获取文件夹缓存大小示例
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();
    }

    //写入文件
    File file1 = await file.writeAsString(notes);
    if (file1.existsSync()) {
      LogUtil.d("保存成功");
    }
上一篇下一篇

猜你喜欢

热点阅读