美文网首页iOS技术专题自专题111
iOS开发 清空沙盒路径下的缓存数据

iOS开发 清空沙盒路径下的缓存数据

作者: Li_Cheng | 来源:发表于2016-06-02 17:03 被阅读7154次

引言:

移动应用在处理网络资源时,一般都会做离线缓存处理,其中以图片缓存最为典型,其中很流行的离线缓存框架为 SDWebImage 。
但是,离线缓存会占用手机存储空间,所以缓存清理功能基本成为资讯、购物、阅读类 App 的标配功能。
由于缓存文件是存在 App 的沙盒中,所以我们可以通过 NSFileManager API 来实现对缓存文件大小的计算和数据的删除操作。

我们先来了解一下沙盒机制:

沙盒:iOS系统为每一个应用程序创建一个文件目录,是一个的独立,封闭,安全的空间, 一个沙盒就是一个文件目录。沙盒规定了一个程序只能在自身的沙盒中进行操作,不能去访问其他应用程序的沙盒(iOS8已经部分开放访问)

沙盒的作用: 用来存放非代码文件(图片, 音频, 视频, 属性列表(plist), sqlite数据库, 文本文件, 其他等等)

沙盒中常用的几个路径:

Document文件夹
用来保存应由程序运行时生成的需要持久化的数据, iTunes会自动备份该目录(苹果公司建议将程序中创建的和浏览过的程序存放在这里,iTunes在备份和回复时会自动包含此目录)。
获取方法:

//文件路径是数组,这里取第一个元素
NSString *docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];`

Library文件夹:
用来存储程序的默认设置和其他状态信息,iTunes也会自动备份该目录。
获取方法:

NSString *libraryPath = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES)[0];

Library/Caches:
用来存放缓存文件,iTunes不会备份此目录,此目录下的文件不会在程序退出后删除,一般存放体积比较大但又不太重要的文件。
获取方法:

NSString *cachesPath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];

**Library/Preferences: **
用来存储用户的偏好设置,iOS的setting(设置)会在这个目录中查找应用程序的设置信息,iTunes会自动备份该目录,通常这个文件夹都是由系统进行维护的,建议不要操作他。
系统没有直接获取这个文件夹路径的方法,需要先获取Library路径然后进行字符串拼接找到此路径:

NSString *libraryPath = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDoMainMask, YES)[0]; 
NSString*preferencePath = [libraryPath stringByAppendingString:@“/Preferences”];

注意:不要直接写偏好设置到这个文件夹,而是通过NSUserDefaults来进行偏好设置的保存和读取。

tmp:
保存应用程序的临时文件夹,使用完毕后,将相应的文件从这个目录中删除,如果空间不够,系统也可能会删除这个目录下的文件,iTunes不会同步这个文件夹,在iPhone重启的时候,该目录下的文件会被删除。
这个路径的获取方法和其他的不同,它有自己方法:

NSString *tmpPath = NSTemporaryDirectory();

下面直接上代码:

我们可以封装成一个工具类: ClearCacheTool类。

ClearCacheTool.h文件:

#import <Foundation/Foundation.h>

@interface ClearCacheTool : NSObject

/*s*
 *  获取path路径下文件夹的大小
 *
 *  @param path 要获取的文件夹 路径
 *
 *  @return 返回path路径下文件夹的大小
 */
+ (NSString *)getCacheSizeWithFilePath:(NSString *)path;

/**
 *  清除path路径下文件夹的缓存
 *
 *  @param path  要清除缓存的文件夹 路径
 *
 *  @return 是否清除成功
 */
+ (BOOL)clearCacheWithFilePath:(NSString *)path;

ClearCacheTool.m文件:

#import "ClearCacheTool.h"

@implementation ClearCacheTool

#pragma mark - 获取path路径下文件夹大小
+ (NSString *)getCacheSizeWithFilePath:(NSString *)path{
    
    // 获取“path”文件夹下的所有文件
    NSArray *subPathArr = [[NSFileManager defaultManager] subpathsAtPath:path];
    
    NSString *filePath  = nil;
    NSInteger totleSize = 0;
    
    for (NSString *subPath in subPathArr){
        
        // 1. 拼接每一个文件的全路径
        filePath =[path stringByAppendingPathComponent:subPath];
        // 2. 是否是文件夹,默认不是
        BOOL isDirectory = NO;
        // 3. 判断文件是否存在
        BOOL isExist = [[NSFileManager defaultManager] fileExistsAtPath:filePath isDirectory:&isDirectory];
        
        // 4. 以上判断目的是忽略不需要计算的文件
        if (!isExist || isDirectory || [filePath containsString:@".DS"]){
            // 过滤: 1. 文件夹不存在  2. 过滤文件夹  3. 隐藏文件
            continue;
        }
        
        // 5. 指定路径,获取这个路径的属性
        NSDictionary *dict = [[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:nil];
        /**
         attributesOfItemAtPath: 文件夹路径
         该方法只能获取文件的属性, 无法获取文件夹属性, 所以也是需要遍历文件夹的每一个文件的原因
         */
        
        // 6. 获取每一个文件的大小
        NSInteger size = [dict[@"NSFileSize"] integerValue];
        
        // 7. 计算总大小
        totleSize += size;
    }
    
    //8. 将文件夹大小转换为 M/KB/B
    NSString *totleStr = nil;
    
    if (totleSize > 1000 * 1000){
        totleStr = [NSString stringWithFormat:@"%.2fM",totleSize / 1000.00f /1000.00f];
        
    }else if (totleSize > 1000){
        totleStr = [NSString stringWithFormat:@"%.2fKB",totleSize / 1000.00f ];
        
    }else{
        totleStr = [NSString stringWithFormat:@"%.2fB",totleSize / 1.00f];
    }
    
    return totleStr;
}


#pragma mark - 清除path文件夹下缓存大小
+ (BOOL)clearCacheWithFilePath:(NSString *)path{
    
    //拿到path路径的下一级目录的子文件夹
    NSArray *subPathArr = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:path error:nil];
    
    NSString *filePath = nil;
    
    NSError *error = nil;
    
    for (NSString *subPath in subPathArr)
    {
        filePath = [path stringByAppendingPathComponent:subPath];
        
        //删除子文件夹
        [[NSFileManager defaultManager] removeItemAtPath:filePath error:&error];
        if (error) {
            return NO;
        }
    }
    return YES;
}

使用的时候只需要传入路径就可以了!!!
<br />
本篇文章对应的源代码下载地址:ClearCacheDemo
<br />
<br />

相关文章

网友评论

  • 501b6f1fe1d4:怎么传入路径啊?
  • WHZ闹哪样:tmp:
    保存应用程序的临时文件夹,使用完毕后,将相应的文件从这个目录中删除,如果空间不够,系统也可能会删除这个目录下的文件,iTunes不会同步这个文件夹,在iPhone重启的时候,该目录下的文件会被删除。
    我这边测试着重启手机后文件里面的数据并没有删除
    MooneyWang:我也测了,重启手机确实没有删除该目录文件,所以不知是否只有空间不足时,系统才会去删除
  • 85b85d4f76eb:想请教一下博主,Library/Caches文件下的数据会在系统存储空间不足时被自动清除掉吗?
    一蓑烟雨满眼风波:@WHZ闹哪样 这个清理是自动的吗,我用模拟器做测试,模拟内存已满,但是Library/Caches目录下的文件也没有被清理
    WHZ闹哪样:会的
    In iOS 5.0 and later, the system may delete the Caches directory on rare occasions when the
    system is very low on disk space. This will never occur while an app is running. However, be aware that restoring from backup is not necessarily the only condition under which the Caches directory can be erased.
  • demoker:'iOS8已经部分开放访问'请问这句话是何意?意思是说可以访问和操作其他app的沙盒文件?

本文标题:iOS开发 清空沙盒路径下的缓存数据

本文链接:https://www.haomeiwen.com/subject/jlckdttx.html