根据上一篇计算文件夹大小文章进一步扩展,封装一个自动根据路径获取该文件或文件夹的大小的NSString分类
#import "NSString+JSFileSize.h"
@implementation NSString (JSFileSize)
- (unsigned long long)fileSize {
unsigned long long fileSize = 0;
// 文件管理者
NSFileManager *fileManager = [NSFileManager defaultManager];
// 通过当前路径获取文件或文件夹
NSError *error = nil;
NSDictionary *attributes = [fileManager attributesOfItemAtPath:self error:&error];
if (error || !attributes) {
NSLog(@"%@",error);
return 0.0;
}
// 判断类型 文件 或 文件夹 或者 其他
NSString *fileType = attributes.fileType;
if ([fileType isEqualToString:NSFileTypeDirectory]) {
// 文件夹
NSArray <NSString *>*subPaths = [fileManager subpathsAtPath:self];
// 遍历子路径,累加文件大小
for (NSString *subPath in subPaths) {
// 拼接全路径
NSString *fullPath = [self stringByAppendingPathComponent:subPath];
NSError *error = nil;
NSDictionary *attrs = [fileManager attributesOfItemAtPath:fullPath error:&error];
if (error) {
NSLog(@"%@",error);
}
fileSize += attrs.fileSize;
}
} else if ([fileType isEqualToString:NSFileTypeRegular]) {
// 文件
fileSize = attributes.fileSize;
}
return fileSize;
}
- (void)logFileSize {
unsigned long long fileSize = 0;
// 文件管理者
NSFileManager *fileManager = [NSFileManager defaultManager];
// 是否为文件夹
BOOL isDirectory = NO;
// 路径是否仔仔
BOOL isExist = [fileManager fileExistsAtPath:self isDirectory:&isDirectory];
if (!isExist) {
return;
}
if (isDirectory) {
// 文件夹
NSArray <NSString *>*subPaths = [fileManager subpathsAtPath:self];
// 遍历子路径,累加文件大小
for (NSString *subPath in subPaths) {
// 拼接全路径
NSString *fullPath = [self stringByAppendingPathComponent:subPath];
NSError *error = nil;
NSDictionary *attrs = [fileManager attributesOfItemAtPath:fullPath error:&error];
if (error) {
NSLog(@"%@",error);
}
fileSize += attrs.fileSize;
}
} else {
// 通过当前路径获取文件或文件夹
NSError *error = nil;
NSDictionary *attributes = [fileManager attributesOfItemAtPath:self error:&error];
if (error || !attributes) {
NSLog(@"%@",error);
return ;
}
// 文件
fileSize = attributes.fileSize;
}
NSLog(@"文件/文件夹大小:%llu B",fileSize);
}
@end
封装了两个方法
/** 返回文件或文件夹的大小,单位B */
- (unsigned long long)fileSize;
/** 控制台打印文件或文件夹大小 */
- (void)logFileSize;
两个方法中fileSize
用于返回具体的值,而logFileSize
只用于控制台的打印
主要区别在于判断是文件还是文件夹的方式不同,计算的过程完全一致
这样在开发中,我们只需要拼接好路径来调用API即可