就像大家都知道的,iOS中的每一个APP都有一个独立的一个沙盒目录,存放用户的一些数据,并且每个APP的沙盒互相之间并不能直接访问,从而起到了保护用户隐私的作用。
那来看看沙盒目录(sandbox)中都是些什么吧:
获取当前APP的沙盒目录的路径:
NSString *homePath = NSHomeDirectory(); NSLog(@"homePath == %@", homePath);
沙盒路径打印出来后复制一下,Finder轻点选择“前往文件夹”,把刚刚复制的路径粘贴进去,然后就会看到:
这三个文件夹
其中:
Documents:存放的是程序中建立的数据,比如我们程序中创建的数据库文件等,还有一些浏览的文件数据等
Library: 下有“Caches”和“Preferences”两个文件夹
Caches: 缓存。 且该文件夹在iPhone重启时 数据会被丢弃
Preferences:偏好设置
tmp: 临时文件,APP没使用时,会被自动丢弃
有的时候需要清除缓存,清除的就是Library下Caches里的所有文件了,所以整体思路就是:
1.获取到Caches的文件夹路径;
NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]; NSLog(@"%@",cachesPath);
2. 遍历获取到并拼接每个子目录的完整路径 (使用NSFileManager操作文件(包括计算文件大小、删除文件)时,都需要用到这个完整路径)
// 拿到所有子文件路径的数组 NSArray *filesArr = [manager subpathsAtPath:cachesPath]; // 拿到每个子文件的路径,如有有不想清除的文件就在这里判断 for (NSString *childFilePath in filesArr) { // 拼接成完整路径 NSString *fullPath = [cachesPath stringByAppendingString:[NSString stringWithFormat:@"/%@",childFilePath]]; // NSLog(@"* %@",fullPath); folderSize += [self fileSizeAtPath:fullPath]; // 方法.计算单个文件夹的大小 // NSLog(@"size===%f",folderSize); }
3. 计算单个文件夹的大小,这里返回的单位是MB-(float)fileSizeAtPath:(NSString *)path { NSFileManager *manager = [NSFileManager defaultManager]; // NSLog(@"path === %@",path); if ([manager fileExistsAtPath:path]) { long long size = [manager attributesOfItemAtPath:path error:nil].fileSize; // NSLog(@"%lld",size); return size/1024.0/1024.0; } return 0; }
4. 遍历整个caches下的所有文件,并且一一删除
// 拿到所有子文件路径的数组 NSArray *filesArr = [manager subpathsAtPath:cachesPath]; // 拿到每个子文件的路径,如有有不想清除的文件就在这里判断 for (NSString *childFilePath in filesArr) { // 拼接成完整路径 NSString *fullPath = [cachesPath stringByAppendingString:[NSString stringWithFormat:@"/%@",childFilePath]]; [manager removeItemAtPath:fullPath error:nil]; // remove }
在实际项目中,有的时候会加上AlertView提醒,像这样: