前言:项目中我们用到
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();
//写入文件