zoukankan      html  css  js  c++  java
  • 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];
    }
    

    实现效果:

  • 相关阅读:
    mysql常用命令
    Navicat连接MySQL数据库出现 ERROR 2059 (HY000): Authentication plugin 'caching_sha2_password' cannot be loaded
    java——Spring(3)
    java———Spring(2)(补充)
    Java——Spring(1)
    Struts2框架(2)
    Struts2框架(1)
    java——Mybatis(2)
    java——MyBatis(1)
    java——Hibernate(2)
  • 原文地址:https://www.cnblogs.com/worldtraveler/p/4778395.html
Copyright © 2011-2022 走看看