iOS文件计算和清理(SDWebImage延伸)

前言

当使用SDWebImage下载图片的时候,会自动帮我们做一个缓存,用来下次使用的时候可以直接从缓存中取出,而不用再次下载,但是一般的应用程序都会有一个清除缓存的功能,有得时候是图片,有得时候是其他的东西,SDWebImage这么强大的框架当然也是有缓存清理的功能啦,但是我们如果想要清理其他的文件夹,也就是说并不局限于清除缓存这个功能,那么我们就可以自己制作一个清除文件的工具了。下面主要对SDWebImage清除图片缓存作延伸。

常见功能

文件夹大小计算

一般的,当我们清除缓存的时候,会告诉用户当前的缓存有多少,来让用户自己决定是否清除缓存,这个时候需要我们来计算缓存的大小,在SDWebImage中,有一个方法可以直接获取文件尺寸

NSInteger size = [[SDImageCache sharedImageCache] getSize];

获取之后,我们直接处理这个数字,将其转换为MB或者KB等就行了,是不是很简单,我们不用管图片存在哪里,也不管怎么获取,直接使用框架的方法即可,因为框架内部会为我们计算。
内部是怎么计算的呢?我们来看一下getSize这个方法

- (NSUInteger)getSize {
    __block NSUInteger size = 0;
    //同步计算
    dispatch_sync(self.ioQueue, ^{
        //拿到存储路径下的枚举,即所有缓存的图片文件
        NSDirectoryEnumerator *fileEnumerator = [_fileManager enumeratorAtPath:self.diskCachePath];
        //遍历图片文件
        for (NSString *fileName in fileEnumerator) {
            //拼接路径,得到图片的绝对路径
            NSString *filePath = [self.diskCachePath stringByAppendingPathComponent:fileName];
            //获得图片文件的属性
            NSDictionary<NSString *, id> *attrs = [[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:nil];
            //图片大小累加
            size += [attrs fileSize];
        }
    });
    return size;
}

通过观察SDWebImage的文件夹尺寸计算方法,我们可以延伸出文件夹的尺寸计算,在得到我们要计算的文件夹路径directoryPath之后

    // 获取文件管理者
    NSFileManager *mgr = [NSFileManager defaultManager];
    // 获取文件夹下所有的子路径,包含子路径的子路径
    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 (!isExist || isDirectory) continue;
         // 获取文件属性
         NSDictionary *attr = [mgr attributesOfItemAtPath:filePath error:nil];
         // 获取文件尺寸
         NSInteger fileSize = [attr fileSize];
         totalSize += fileSize;
     }

文件清理

在SDWebImage中,缓存清理同样是一个方法

[[SDImageCache sharedImageCache] clearDiskOnCompletion:nil];

我们来看一下内部

- (void)clearDiskOnCompletion:(nullable SDWebImageNoParamsBlock)completion {
    //异步执行
    dispatch_async(self.ioQueue, ^{
        //清除文件夹
        [_fileManager removeItemAtPath:self.diskCachePath error:nil];
        [_fileManager createDirectoryAtPath:self.diskCachePath
                withIntermediateDirectories:YES
                                 attributes:nil
                                      error:NULL];

        if (completion) {
            //清除完成后的回调
            dispatch_async(dispatch_get_main_queue(), ^{
                completion();
            });
        }
    });
}

同样的,我们对其进行延伸,清除一个文件夹内所有文件,在得到我们要清除的文件夹路径directoryPath之后

    //获取文件管理者
    NSFileManager *manager = [NSFileManager defaultManager];
    // 获取cache文件夹下所有文件,不包括子路径的子路径
    NSArray *subPaths = [manager contentsOfDirectoryAtPath:directoryPath error:nil];
    for (NSString *subPath in subPaths) {
        // 拼接完成全路径
        NSString *filePath = [directoryPath stringByAppendingPathComponent:subPath];
        // 删除路径
        [manager removeItemAtPath:filePath error:nil];
    }

总结

因为可能以后会多次使用到这些功能,所以说,可以封装一个文件工具类,然后以后用的时候,直接导入使用即可。下面项目中有工具类的封装,可自行下载查看。

那么就先说到这里啦,有疑问和不足请务必要通知我!!!同时也欢迎大家关注和顶一下!嘿嘿嘿!

github地址:github
欢迎关注和star

欢迎来到我的博客,我是AnICoo1,我喂自己袋盐
有错误请评论指出或联系我,不胜感激!
个人邮箱:[email protected]
转载请注明出处,毕竟写了这么多也不容易,谢谢!

你可能感兴趣的:(iOS)