IOS 计算沙盒中一个目录的大小

项目中碰到一个需要计算沙盒目录的大小的功能。

看了下NSFileManager提供的方法,找到一个

<span style="font-size:18px;">- (NSDictionary *)attributesOfItemAtPath:(NSString *)path error:(NSError **)error NS_AVAILABLE(10_5, 2_0);
</span>

经过测试发现这个方法只能计算文件的大小,而不能直接计算文件夹的大小;

发现这个问题,解决方法只有一种方法了,就是递归便利目录累加所有的文件;

本来气势冲冲的写了一半了,突然发现

- (NSArray *)subpathsAtPath:(NSString *)path;

这个方法居然会返回子目录中所有文件的相对路径!!

哎哟我勒个去,这样就不要写递归了,直接拼接上相对路径,直接就能够拿到你想要的绝对路径了!!

这样计算一个目录的大小就只用写一个while就可以了

+(NSString*)getCacheSize
{

    NSDate* begin = [NSDate date];

    NSFileManager* fm = [NSFileManager defaultManager];
    __block NSError* error = nil;

    __block NSUInteger fileSize = 0;

    //获取Books的缓存
    dispatch_sync(queue, ^{
        NSArray* subFiles = [fm subpathsAtPath:BOOKHEADERPath([LoginPlugin share].userID)];
        NSLog(@"subpath = %@",subFiles);
        for (NSString* fileName in subFiles) {
            if ([fileName hasSuffix:@"png"]||[fileName hasSuffix:@"jpg"]) {
                NSDictionary* dic = [fm attributesOfItemAtPath:BOOKPATH([LoginPlugin share].userID,fileName) error:&error];
                NSUInteger size = (error ? 0:[dic fileSize]);
                fileSize += size;
            }
        }
    });

    NSString* cacheString = [NSString stringWithFormat:@"%.1fM",fileSize/(1024.0*1024)];
    NSTimeInterval time = [begin timeIntervalSinceNow];
    NSLog(@"便利文件耗费时间:%lf",time/60.0);
    return cacheString;
}

不要担心便利太多文件会影响效率,系统便利10M的文件仅耗费了0.00025S。这个也不是绝对的,需要自己亲自调试了

在我的项目还有另一个问题,我要统计缓存,因为我用了SDWebImage,所以要整合我自己下载的图书还有SDImageCache;

查看了下SDImageCache的代码,其中提供了一个方法:

- (void)calculateSizeWithCompletionBlock:(SDWebImageCalculateSizeBlock)completionBlock;

内部实现是在一个&#8;串行的queue中便利,然后通过block回调。

但是如果碰到我上边写的代码有个返回值的,就有问题了。

因为我不可能在Block里边return size;

这个如何是好,着实让人欢喜让人忧

哈哈,这个时候解决办法就是获取SDImageCache的queue,然后在它执行完自己的计算task之后,同步调用阻塞主线程,这样就可以不需要修改代码了

为毛这样可以捏?因为这个queue是串行的,哇哈哈!!!

方法如下:

+(NSString*)getCacheSize
{

    NSDate* begin = [NSDate date];

    SDImageCache* imageCache = [[SDWebImageManager sharedManager] imageCache];
    dispatch_queue_t queue =imageCache .ioQueue;

    NSFileManager* fm = [NSFileManager defaultManager];
    __block NSError* error = nil;

    __block NSUInteger fileSize = 0;

    //获取SD的缓存
    [imageCache calculateSizeWithCompletionBlock:^(NSUInteger fileCount, NSUInteger totalSize) {
        fileSize += totalSize;
    }];

    //获取Books的缓存
    dispatch_sync(queue, ^{
        NSArray* subFiles = [fm subpathsAtPath:BOOKHEADERPath([LoginPlugin share].userID)];
        NSLog(@"subpath = %@",subFiles);
        for (NSString* fileName in subFiles) {
            if ([fileName hasSuffix:@"png"]||[fileName hasSuffix:@"jpg"]) {
                NSDictionary* dic = [fm attributesOfItemAtPath:BOOKPATH([LoginPlugin share].userID,fileName) error:&error];
                NSUInteger size = (error ? 0:[dic fileSize]);
                fileSize += size;
            }
        }
    });

    NSString* cacheString = [NSString stringWithFormat:@"%.1fM",fileSize/(1024.0*1024)];
    NSTimeInterval time = [begin timeIntervalSinceNow];
    NSLog(@"便利文件耗费时间:%lf",time/60.0);
    return cacheString;
}

妥妥的,因为是个类方法,就不提供源代码鸟!只需要替换下测试路径就OK了!

时间: 2024-10-10 14:15:15

IOS 计算沙盒中一个目录的大小的相关文章

计算沙盒下文件夹内容大小 清空沙盒 文件 目录

1 +(float)fileSizeForDir:(NSString*)path//计算文件夹下文件的总大小 2 3 { 4 5 NSFileManager *fileManager = [[NSFileManager alloc] init]; 6 7 float size =0; 8 9 NSArray* array = [fileManager contentsOfDirectoryAtPath:path error:nil]; 10 11 for(int i = 0; i<[array

IOS-沙盒机制(一 简述)

一 IOS沙盒机制 出于安全的目的,应用程序只能将自己的数据和偏好设置写入到几个特定的位置上.当应用程序被安装到设备上时,系统会为其创建一个家目录,这个家目录就是应用程序的沙盒.所以的文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等.(For security reasons, iOS places each app (including its preferences and data) in a sandbox at install time. A sandbox is a

iOS App沙盒模型文件目录详解Swift版

本文会比较全面的介绍iOS App沙盒模型的文件夹及其使用场景,以及通过swift取得这些文件夹的方法 iOS 中的沙盒机制介绍 iOS 中的沙盒机制(SandBox)是一种安全体系.每个 iOS 应用程序都有一个单独的文件系统(存储空间),而且只能在对应的文件系统中进行操作,此区域被称为沙盒.所有的非代码文件都要保存在此,例如属性文件 plist.文本文件.图像.图标.媒体资源等. iPhone沙箱模型的四个文件夹介绍和功能 1.Documents 目录:您应该将所有de应用程序数据文件写入到

iOS沙盒中,如何判断存在文件、目录

在iOS开发中,在沙盒中创建沙盒一些存储各个功能的文件目录或者文件. 使用: [NSFileManager defaultManager] 1.判断目录,用她可以. 2.判断文件,用她可以. 3.创建目录,用她可以. 4.创建文件,用她可以. 基本实现都差不多,就是得到目录.文件在沙盒的路径之后. 1.首先判断是否存在: [[NSFileManager defaultManager] fileExistsAtPath:目录(文件)路径] 2.不存在就创建她: [[NSFileManager de

iOS学习7:iOS沙盒(sandBox)机制(一)之获取沙盒路径及目录说明(转)

转:http://my.oschina.net/joanfen/blog/151145 一.iOS沙盒机制 iOS的应用只能访问为该应用创建的区域,不可访问其他区域,应用的其他非代码文件都存在此目录下,包括图片,属性文件plist,bundle,nib文件等,这块区域称之为沙盒(sandBox). 每个应用都有属于自己的存储空间,即沙盒 应用只能访问自己的沙盒,不可访问其他区域 如果应用需要进行文件操作,则必须将文件存放在沙盒中,尤其是数据库文件,在电脑上操作时,可以去访问,但是如果要装在真机上

IOS程序 沙盒目录 结构分析 目录获取

每个iOS应用都有自己的应用沙盒(应用沙盒就是文件系统目录),与其他文件系统隔离.应用必须待在自己的沙盒里,其他应用不能访问该沙盒 应用沙盒的文件系统目录,如下图所示(假设应用的名称叫network) 模拟器应用沙盒的根路径在: (apple是用户名, 7.1是模拟器版本) /Users/apple/Library/Application Support/iPhone Simulator/7.1/Applications 应用程序包:(上图中的network)包含了所有的资源文件和可执行文件 D

将UIImage保存到iOS照片库和对应程序沙盒中

将UIImage保存到iOS照片库和对应程序沙盒中 转载▼ 1.保存到iOS照片库需要引入QuartzCore.framework框架,具体代码如下:.h文件#import <QuartzCore/QuartzCore.h>UIImageView *imageView;@property (nonatomic, retain) IBOutlet UIImageView *imageView;.m文件UIGraphicsBeginImageContext(imageView.bounds.siz

利用IOS模拟器将数据存储在本地沙盒中以及从沙盒中读取详细步骤

使用IO模拟器,应用沙盒的根路径为:/Users/apple/Library/Application Support/iPhone Simulator/6.0/Applications(6.0为模拟器的版本) 1.获取应用沙盒目录 <1>利用沙盒根目录拼接"Documents"字符串 NSString * home = NSHomeDirectory(); NSString * documents = [home stringByAppendingPathComponent

iOS target在沙盒中找不到该文件

当程序奔溃出现这个报错信息时 解决办法: 这是在沙盒中找不到文件所导致的