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

2017-03-13  本文已影响114人  ShenYj

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


上一篇下一篇

猜你喜欢

热点阅读