iOS随记-计算文件夹大小

网上有很多方法,但是在文件夹里还有文件夹,嵌套多层的话,大部分都有问题,可能需要使用递归来算,事实上不需要这么麻烦的,直接贴出代码:

/**
 计算文件/文件夹大小(外部调用时,请使用子线程)

 @param filePath 文件/文件夹路径
 @return 返回文件/文件夹大小
 */
+ (long long)getFileSizeForFilePath:(NSString *)filePath {
    NSFileManager *fileManager = [NSFileManager defaultManager];
    BOOL isDir = NO;
    BOOL exists = [fileManager fileExistsAtPath:filePath isDirectory:&isDir];
    if (!exists) {
        return 0;
    }
    if (isDir) {//如果是文件夹
        NSDirectoryEnumerator *enumerator = [fileManager enumeratorAtPath:filePath];
        long long totalSize = 0;
      //不同点在这里,很多都是for (NSString *fileName in enumerator),但是这样如果文件夹里还包含文件夹就计算的不对了,就需要使用递归来算,比较麻烦
        for (NSString *fileName in enumerator.allObjects) {
            //文件路径
            NSString *fullFilePath = [filePath stringByAppendingPathComponent:fileName];
            //判断是否为文件
            BOOL isFullDir = NO;
            [fileManager fileExistsAtPath:fullFilePath isDirectory:&isFullDir];
            if (!isFullDir) {
                NSError *error = nil;
                NSDictionary *dict = [fileManager attributesOfItemAtPath:fullFilePath error:&error];
                if (!error) {
                    totalSize += [dict[NSFileSize] longLongValue];
                }
            }
        }
        return totalSize;
    } else {//是文件
        NSError *error = nil;
        NSDictionary *dict = [fileManager attributesOfItemAtPath:filePath error:&error];
        if (error) {
            Plog(@"文件大小获取失败--%@", error);
            return 0;
        } else {
           return [dict[NSFileSize] longLongValue];
        }
    }
}

有人在转换成MB的时候,用1024来换算,这个是错误的,事实上苹果已经为你写好了换算的方法:

[NSByteCountFormatter stringFromByteCount:totalSize countStyle:NSByteCountFormatterCountStyleFile];

这个方法直接返回一个字符串(如3.5MB)。

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

推荐阅读更多精彩内容

  • df -lh du -s /usr/* | sort -rn这是按字节排序 du -sh /usr/* | sor...
    码农小杨阅读 5,843评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,442评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,953评论 18 399
  • 先贴代码: 解释说明 上面的方法遍历文件夹利用了系统的目录枚举类NSDirectoryEnumerator来递归遍...
    OC笔记阅读 8,725评论 0 0
  • 她已年过四十,皮肤却白晳光滑。只眼角略有细纹。双眉毛淡淡的,只前面短而平的眉头清晰可见。粉紫色眼镜框后,蚕豆...
    淡然雨阅读 1,930评论 3 1