计算文件夹/文件的总大小

根据上一篇计算文件夹大小文章进一步扩展,封装一个自动根据路径获取该文件或文件夹的大小的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即可


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 218.241.181.202 wxhl60 123456 192.168.10.253 wxhl66 wxhl6...
    CYC666阅读 1,443评论 0 6
  • 计算一个文件夹的大小,首先你要知道你想计算的是哪个文件夹的大小。 所以第一步,你要知道你的文件夹路径。 文件路径一...
    攻克乃还_阅读 990评论 0 0
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,211评论 30 472
  • 27、ViewController的didReceiveMemoryWarning是在什么时候调用的?默认的操作是...
    烟雨平生花飞舞阅读 623评论 0 1
  • 总是嫌自己嘴笨,不会说话。今天听了卡洛琳.塔洛特的《所谓会说话,就是会换位思考》,才发现脑子也有问题。与其抱怨,不...
    张永胜_永往直前阅读 555评论 0 0