计算缓存的方法:(用数组或者遍历器来保存子路径)
-
一.用数组保存所有子路径
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *ID = @"cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];
}
cell.textLabel.text = @"清除缓存";
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
if (indexPath.section == 0 && indexPath.row == 0) {
unsigned long long size = [self getSize];
ZGKLog(@"size = %llu", size);
};
}
- (unsigned long long)getSize{
// 0.获得缓存文件路径
NSString *cachesPath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).lastObject;
ZGKLog(@"cachesPath: %@", cachesPath);
NSString *dirPath = [cachesPath stringByAppendingPathComponent:@"default"];
// 1.文件管理者
NSFileManager *manager = [NSFileManager defaultManager];
// 2.获得文件夹得属性
// 注意1: 获得文件夹的一些属性资料(NSFileSize如果有子集目录,则文件大小不为NSFileSize,如果只有一个subPath才是该文件的大小,因为文件夹没有NSFileSize记录整个文件的大小,都是要通过遍历子目录计算的)
NSDictionary *attrs = [manager attributesOfItemAtPath:dirPath error:nil];
/*
打印attires的结果:
NSFileCreationDate = "2017-02-07 17:15:11 +0000";
NSFileExtensionHidden = 0;
NSFileGroupOwnerAccountID = 20;
NSFileGroupOwnerAccountName = staff;
NSFileModificationDate = "2017-02-09 17:56:09 +0000";
NSFileOwnerAccountID = 501;
NSFilePosixPermissions = 493;
NSFileReferenceCount = 4;
NSFileSize = 136;
NSFileSystemFileNumber = 22754319;
NSFileSystemNumber = 16777220;
NSFileType = NSFileTypeDirectory;
*/
ZGKLog(@"attrs :\n %@", attrs);
// 注意:NSFilemanager的contentsOfDirectoryAtPath:和subpathsAtPath:方法的异同
// 获得文件夹一级目录
NSArray *contentPaths = [manager contentsOfDirectoryAtPath:dirPath error:nil];
NSLog(@"contents = %@", contentPaths);
// 2.获得文件夹所有子级目录(用数组获得所有子路径)
NSArray *subPaths = [manager subpathsAtPath:dirPath];
NSLog(@"subPaths = %@", subPaths);
// 3.计算所有子级目录的大小(注意:在mac系统下1M = 1000KB,而不是1024)
unsigned long long size = 0;
for (NSString *subPath in subPaths) {
// 全路径
NSString *fullPath = [dirPath stringByAppendingPathComponent:subPath];
// 文件属性
NSDictionary *attrs = [manager attributesOfItemAtPath:fullPath error:nil];
// 注意3: 累加(attributes的fileSize属性直接返回文件的大小)
size += attrs.fileSize;
// size += [attrs[NSFileSize] unsignedLongLongValue];
}
// 4.返回总缓存大小
return size;
}
1.获得文件夹的一些属性资料(NSFileSize如果有子集目录,则文件大小不为NSFileSize,如果只有一个subPath才是该文件的大小,因为文件夹没有NSFileSize记录整个文件的大小,都是要通过遍历子目录计算的)
2.注意:NSFilemanager的contentsOfDirectoryAtPath:和subpathsAtPath:方法的异同
3.注意3: 累加(attributes的fileSize属性直接返回文件的大小)
4.清除缓存操作要在子线程执行,计算完毕以后再回主线程刷新UI
-
二.用遍历器保存所有子路径
- (unsigned long long)getSize{
// 0.获得缓存文件路径
NSString *cachesPath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).lastObject;
ZGKLog(@"cachesPath: %@", cachesPath);
NSString *dirPath = [cachesPath stringByAppendingPathComponent:@"default"];
// 1.文件管理者
NSFileManager *manager = [NSFileManager defaultManager];
// 2.获得文件夹得属性
// 获得文件夹的一些属性资料(NSFileSize如果有子集目录,则文件大小不为NSFileSize,如果只有一个subPath才是该文件的大小,因为文件夹没有NSFileSize记录整个文件的大小,都是要通过遍历子目录计算的)
NSDictionary *attrs = [manager attributesOfItemAtPath:dirPath error:nil];
/*
NSFileCreationDate = "2017-02-07 17:15:11 +0000";
NSFileExtensionHidden = 0;
NSFileGroupOwnerAccountID = 20;
NSFileGroupOwnerAccountName = staff;
NSFileModificationDate = "2017-02-09 17:56:09 +0000";
NSFileOwnerAccountID = 501;
NSFilePosixPermissions = 493;
NSFileReferenceCount = 4;
NSFileSize = 136;
NSFileSystemFileNumber = 22754319;
NSFileSystemNumber = 16777220;
NSFileType = NSFileTypeDirectory;
*/
ZGKLog(@"attrs :\n %@", attrs);
// 获得文件夹一级目录
NSArray *contentPaths = [manager contentsOfDirectoryAtPath:dirPath error:nil];
NSLog(@"contents = %@", contentPaths);
// // 2.获得文件夹所有子级目录
// NSArray *subPaths = [manager subpathsAtPath:dirPath];
// NSLog(@"subPaths = %@", subPaths);
// 2.使用遍历器
NSDirectoryEnumerator *enumerator = [manager enumeratorAtPath:dirPath];
NSLog(@"enumerator = %@", enumerator);
// 3.计算所有子级目录的大小(注意:在mac系统下1M = 1000KB,而不是1024)
unsigned long long size = 0;
for (NSString *subPath in enumerator) {
// 全路径
NSString *fullPath = [dirPath stringByAppendingPathComponent:subPath];
// 文件属性
NSDictionary *attrs = [manager attributesOfItemAtPath:fullPath error:nil];
// 累加(fileSize直接返回文件的大小)
size += attrs.fileSize;
// size += [attrs[NSFileSize] unsignedLongLongValue];
}
// 4.返回总缓存大小
return size; // 1168471
}
- 注意使用的遍历器,用一个对象储存了所有的子路径
// 2.使用遍历器
NSDirectoryEnumerator *enumerator = [manager enumeratorAtPath:dirPath];
NSLog(@"enumerator = %@", enumerator);