App在处理网络资源时,一般都会做离线缓存处理,其中最典型离线缓存框架为SDWebImage。
但是,离线缓存会占用一定的存储空间,所以缓存清理功能基本成为资讯、购物、阅读类app的标配功能。
下面用代码来分别介绍缓存文件大小的获取及清除缓存。
缓存文件大小的获取
我们可以新建一个工具类,并在类中定义一个类方法,声明如下:
/**
* 获取文件夹尺寸
* @param directoryPath 文件夹路径
* @param complete 计算完毕的Block回调
*/
+ (void)getCacheSize:(NSString *)directoryPath complete:(void(^)(NSInteger))complete;
相应的实现如下:
+ (void)getCacheSize:(NSString *)directoryPath complete:(void(^)(NSInteger))complete
{
/*
// 获取caches 文件夹路径
NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, true) firstObject];
// 获取default路径
NSString *defaultPath = [cachePath stringByAppendingPathComponent:@"default"];
*/
// 遍历文件夹所有文件,一个一个加起来
// 获取文件管理者
NSFileManager *mgr = [NSFileManager defaultManager];
// 判断是否是文件夹
BOOL isDirectory;
BOOL isExist = [mgr fileExistsAtPath:directoryPath isDirectory:&isDirectory];
if (!isDirectory || !isExist){
// 抛出异常 name 异常名称 reason报错原因
NSException *excp =[NSException exceptionWithName:@"directory path error" reason:@"需要传入的是存在的文件夹的路径" userInfo:nil];
[excp raise];
};
// 开启异步
dispatch_async(dispatch_get_global_queue(0, 0), ^{
// 获取文件夹下所有的子路径 包括子路径的子路径
NSArray *subPaths = [mgr subpathsAtPath:directoryPath];
NSInteger totalSize = 0;
for (NSString *subPath in subPaths) {
// 获取到的文件的全路径
NSString *filePath = [directoryPath stringByAppendingPathComponent:subPath];
// 忽略隐藏文件
if([filePath containsString:@".DS"]) continue;
// 判断是否是文件夹
BOOL isDirectory;
BOOL isExist = [mgr fileExistsAtPath:filePath isDirectory:&isDirectory];
if(isDirectory || !isExist) continue;
//获取文件属性 attributesOfItemAtPath 只能回去文件尺寸,获取文件夹不对
NSDictionary *attr = [mgr attributesOfItemAtPath:filePath error:nil];
// default尺寸
NSInteger fileSize = [attr fileSize];
totalSize += fileSize;
}
NSLog(@"缓存大小:%ld",totalSize);
dispatch_sync(dispatch_get_main_queue(), ^{
//block回调
if (complete) {
complete(totalSize);
}
});
});
}
清除缓存
方法的声明
/**
* 清空缓存
* @param directoryPath 文件夹路径
*/
+ (void)removeCache:(NSString *)directoryPath;
方法的实现
+ (void)removeCache:(NSString *)directoryPath
{
// 清空缓存cache中的所有文件夹
// 获取文件管理者
NSFileManager *mgr = [NSFileManager defaultManager];
BOOL isDirectory;
BOOL isExist = [mgr fileExistsAtPath:directoryPath isDirectory:&isDirectory];
if (!isDirectory || !isExist){
// 抛出异常 name 异常名称 reason报错原因
NSException *excp =[NSException exceptionWithName:@"directory path error" reason:@"需要传入的是存在的文件夹的路径" userInfo:nil];
[excp raise];
};
// 获取文件夹下所有文件。不包括子路径的子路径
NSArray *subPaths = [mgr contentsOfDirectoryAtPath:directoryPath error:nil];
for (NSString *subPath in subPaths) {
// 拼接完整路径
NSString *filePath = [directoryPath stringByAppendingPathComponent:subPath];
// 删除路径
[mgr removeItemAtPath:filePath error:nil];
}
}