知识点29:封装计算缓存的类
2017-02-12 本文已影响9人
枫之叶_小乙哥
// .h文件
#import <Foundation/Foundation.h>
@interface NSString (ZGKCalculateCacheExtension)
//+ (unsigned long long)getCacheSizeFromfilePath:(NSString *)filePath;
- (unsigned long long)fileSize;
@end
// .m文件
#import "NSString+ZGKCalculateCacheExtension.h"
@implementation NSString (ZGKCalculateCacheExtension)
//+ (unsigned long long)getCacheSizeFromfilePath:(NSString *)filePath{
//
//}
// 方法一:通过attrs为nil,则attrs.fileSize也为0,来排除文件不存在的情况
//- (unsigned long long)fileSize{
//
// // 0.文件管理者
// NSFileManager *manager = [NSFileManager defaultManager];
//
// // 判断是文件还是文件夹(文件夹:NSFileTypeDirectory 文件:NSFileTypeRegular)
// BOOL isDirectory = [[manager attributesOfItemAtPath:self error:nil].fileType isEqualToString:NSFileTypeDirectory];
//
// // 储存文件大小
// unsigned long long size = 0;
//
// if (isDirectory) { // 文件夹
// // 2.使用遍历器储存所有子路径
// NSDirectoryEnumerator *enumerator = [manager enumeratorAtPath:self];
//
// // 3.计算所有子级目录的大小(注意:在mac系统下1M = 1000KB,而不是1024)
// for (NSString *subPath in enumerator) {
//
// // 3.0拼接成完整的子路径
// NSString *fullPath = [self stringByAppendingPathComponent:subPath];
//
// // 3.1文件属性
// NSDictionary *attrs = [manager attributesOfItemAtPath:fullPath error:nil];
//
// // 3.2累加(fileSize直接返回文件的大小)
// size += attrs.fileSize;
// // size += [attrs[NSFileSize] unsignedLongLongValue];
// }
//
// }else{ // 文件
// NSDictionary *attrs = [manager attributesOfItemAtPath:self error:nil];
// size = attrs.fileSize;
// }
//
// // 4.返回总缓存大小
// return size; // 1168471
//}
// 方法二:通过[manager fileExistsAtPath:self isDirectory:&isDirectory]来判断文件不存在的情况
// 对象方法对比类方法比较好用
/**** 计算缓存的方法要在子线程中计算,再返回主线程刷新UI ****/
- (unsigned long long)fileSize{
// 0.文件管理者
NSFileManager *manager = [NSFileManager defaultManager];
// 判断文件会否存在(还可以判断是否是文件夹)
BOOL isExist = NO; // 文件是否存在
BOOL isDirectory = NO; // 是否是文件夹
isExist = [manager fileExistsAtPath:self isDirectory:&isDirectory];
// 储存文件大小
unsigned long long size = 0;
if (!isExist) {
ZGKLog(@"warning: 要计算缓存的文件夹不存在")
return size;
}
// 判断是文件还是文件夹(文件夹:NSFileTypeDirectory 文件:NSFileTypeRegular)
// 判断是否是文件夹
// isDirectory = [[manager attributesOfItemAtPath:self error:nil].fileType isEqualToString:NSFileTypeDirectory];
if (isDirectory) { // 文件夹
// 2.使用遍历器储存所有子路径
NSDirectoryEnumerator *enumerator = [manager enumeratorAtPath:self];
// 3.计算所有子级目录的大小(注意:在mac系统下1M = 1000KB,而不是1024)
for (NSString *subPath in enumerator) {
// 3.0拼接成完整的子路径
NSString *fullPath = [self stringByAppendingPathComponent:subPath];
// 3.1文件属性
NSDictionary *attrs = [manager attributesOfItemAtPath:fullPath error:nil];
// 3.2累加(fileSize直接返回文件的大小)
size += attrs.fileSize;
// size += [attrs[NSFileSize] unsignedLongLongValue];
}
}else{ // 文件
NSDictionary *attrs = [manager attributesOfItemAtPath:self error:nil];
size = attrs.fileSize;
}
// 4.返回总缓存大小
return size; // 1168471
}
@end
- 1.给一个文件路径,就可以计算该路径文件大小
- 2.计算方法要在子线程执行
- 3.注意:程序中要先判断文件是否存在,其次判断该文件是文件夹还是文件,如果文件不存在提前返回结果
- 4.判断文件的是否存在,是否为文件夹,都是NSFileManager的对象方法