前言:项目中我们用到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();
}
//写入文件
File file1 = await file.writeAsString(notes);
if (file1.existsSync()) {
LogUtil.d("保存成功");
}