iOS计算缓存文件的大小

//获取缓存文件路径

-(NSString *)getCachesPath{

    // 获取Caches目录路径

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask,YES);

    NSString *cachesDir = [paths objectAtIndex:0];

    

    NSString *filePath = [cachesDir stringByAppendingPathComponent:@"com.nickcheng.NCMusicEngine"];

    

    return filePath;

}

///计算缓存文件的大小的M

- (long long) fileSizeAtPath:(NSString*) filePath{

    NSFileManager* manager = [NSFileManager defaultManager];

    if ([manager fileExistsAtPath:filePath]){

        

//        //取得一个目录下得所有文件名

//        NSArray *files = [manager subpathsAtPath:filePath];

//        NSLog(@"files1111111%@ == %ld",files,files.count);

//        

//        // 从路径中获得完整的文件名(带后缀)

//        NSString *exe = [filePath lastPathComponent];

//        NSLog(@"exeexe ====%@",exe);

//        

//        // 获得文件名(不带后缀)

//        exe = [exe stringByDeletingPathExtension];

//        

//        // 获得文件名(不带后缀)

//        NSString *exestr = [[files objectAtIndex:1] stringByDeletingPathExtension];

//        NSLog(@"files2222222%@  ==== %@",[files objectAtIndex:1],exestr);

        

        

        return [[manager attributesOfItemAtPath:filePath error:nil] fileSize];

    }

    

    return 0;

}

- (float ) folderSizeAtPath:(NSString*) folderPath{

    NSFileManager* manager = [NSFileManager defaultManager];

    if (![manager fileExistsAtPath:folderPath]) return 0;

    NSEnumerator *childFilesEnumerator = [[manager subpathsAtPath:folderPath]objectEnumerator];//从前向后枚举器//////

    NSString* fileName;

    long long folderSize = 0;

    while ((fileName = [childFilesEnumerator nextObject]) != nil){

        NSLog(@"fileName ==== %@",fileName);

        NSString* fileAbsolutePath = [folderPath stringByAppendingPathComponent:fileName];

        NSLog(@"fileAbsolutePath ==== %@",fileAbsolutePath);

        folderSize += [self fileSizeAtPath:fileAbsolutePath];

    }

    NSLog(@"folderSize ==== %lld",folderSize);

    return folderSize/(1024.0*1024.0);

}

////////////

-(void)ss{

    // 获取Caches目录路径

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask,YES);

    NSString *cachesDir = [paths objectAtIndex:0];

    

    NSLog(@"cachesDircachesDir == %@",cachesDir);

    //读取缓存里面的具体单个文件/或全部文件//

    NSString *filePath = [cachesDir stringByAppendingPathComponent:@"com.nickcheng.NCMusicEngine"];

    NSArray *array = [[NSArray alloc]initWithContentsOfFile:filePath];

    NSLog(@"filePathfilePath%@ ==array==== %@",filePath, array);

    

    

    NSFileManager* fm=[NSFileManager defaultManager];

    if([fm fileExistsAtPath:filePath]){

        //取得一个目录下得所有文件名

        NSArray *files = [fm subpathsAtPath:filePath];

        NSLog(@"files1111111%@ == %ld",files,files.count);

        

        // 获得文件名(不带后缀)

        NSString * exestr = [[files objectAtIndex:1] stringByDeletingPathExtension];

        NSLog(@"files2222222%@  ==== %@",[files objectAtIndex:1],exestr);

    }

}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////

移动应用在处理网络资源时,一般都会做离线缓存处理,其中以图片缓存最为典型,其中很流行的离线缓存框架为SDWebImage。

但是,离线缓存会占用手机存储空间,所以缓存清理功能基本成为资讯、购物、阅读类app的标配功能。

今天介绍的离线缓存功能的实现,主要分为缓存文件大小的获取、删除缓存文件的实现。

获取缓存文件的大小

由于缓存文件存在沙箱中,我们可以通过NSFileManager API来实现对缓存文件大小的计算。

计算单个文件大小

+(float)fileSizeAtPath:(NSString *)path{
  NSFileManager *fileManager=[NSFileManager defaultManager];
  if([fileManager fileExistsAtPath:path]){
    long long size=[fileManager attributesOfItemAtPath:path error:nil].fileSize;
    return size/1024.0/1024.0;
  }
  return 0;
}

计算目录大小

+(float)folderSizeAtPath:(NSString *)path{
  NSFileManager *fileManager=[NSFileManager defaultManager];
  float folderSize;
  if ([fileManager fileExistsAtPath:path]) {
    NSArray *childerFiles=[fileManager subpathsAtPath:path];
    for (NSString *fileName in childerFiles) {
      NSString *absolutePath=[path stringByAppendingPathComponent:fileName];
      folderSize +=[FileService fileSizeAtPath:absolutePath];
    }
   //SDWebImage框架自身计算缓存的实现
    folderSize+=[[SDImageCache sharedImageCache] getSize]/1024.0/1024.0;
    return folderSize;
  }
  return 0;
}

清理缓存文件

同样也是利用NSFileManager API进行文件操作,SDWebImage框架自己实现了清理缓存操作,我们可以直接调用。

+(void)clearCache:(NSString *)path{
  NSFileManager *fileManager=[NSFileManager defaultManager];
  if ([fileManager fileExistsAtPath:path]) {
    NSArray *childerFiles=[fileManager subpathsAtPath:path];
    for (NSString *fileName in childerFiles) {
      //如有需要,加入条件,过滤掉不想删除的文件
      NSString *absolutePath=[path stringByAppendingPathComponent:fileName];
      [fileManager removeItemAtPath:absolutePath error:nil];
    }
  }
  [[SDImageCache sharedImageCache] cleanDisk];
}

实现效果:

原文地址:https://www.cnblogs.com/worldtraveler/p/4778395.html