NSFileManager 清除缓存功能

第一部分: 计算文件大小

# 获取单个文件的大小的方法
- (long long) fileSizeAtPath:(NSString*) filePath{

  NSFileManager* manager = [NSFileManager defaultManager];

  if ([manager fileExistsAtPath:filePath]){

      //如果文件路径存在, 计算文件大小
      return [[manager attributesOfItemAtPath:filePath error:nil] fileSize];

  }

  return 0;

}


# 遍历文件夹获得文件夹大小,返回单位为: M
- (float)folderSizeAtPath:(NSString *)path{
    
    NSFileManager *fileManager=[NSFileManager defaultManager];
    
    float folderSize;  //定义一个float类型变量, 用来接收文件大小
    
    if ([fileManager fileExistsAtPath:path]) {  //如果文件夹路径存在, 则进行计算
        
        NSArray *childerFiles =[fileManager subpathsAtPath:path];  //获取该文件夹路径下的所有文件
        
        //for-in遍历 , 数据中的文件名
        for (NSString *fileName in childerFiles) {
            
            NSString *absolutePath=[path stringByAppendingPathComponent:fileName];  //拼接该路径下的每一个文件
        
            folderSize +=[self fileSizeAtPath:absolutePath];  //调用方法, 累加计算每一个文件的大小
            
            
        }
        //SDWebImage框架自身计算缓存的实现
        //folderSize+=[[SDImageCache sharedImageCache] getSize]/1024.0/1024.0;
        folderSize = folderSize/1024.0/1024.0;
        
        return folderSize;
    }
    return 0;
}
上面的计算文件夹的方法, 计算第二级文件时, 没有考虑到是文件还是文件夹., 
之前验证过(计算一个文件夹的大小 与 计算该文件夹下文件的大小是不同的)两者的存储量是不一的, 所以有一定的偏差

# 第二种计算文件夹文件大小的方法
- (NSInteger)fileSize{
      //文件管理者
      NSFileManager *mgr = [NSFileManager defaultManager];
      //判断字符串是否为文件/文件夹
      BOOL dir = NO;
      BOOL exists = [mgr fileExistsAtPath:self isDirctory:&dir];
      //文件/文件夹不存在
      if (exists == NO) return 0;
      //self是文件夹
      if (dir){
           //遍历文件夹中的所有内容
           NSArray *subpaths = [mgr subpathsAtPath:self];
           //计算文件夹大小
           NSInteger totalByteSize = 0;
           for (NSString *subpath in subpaths)
              {
                //拼接全路径
                 NSString *fullSubPath = [self stringByAppendingPathComponent:subpath];
              //判断是否为文件
              BOOL dir = NO;
              [mgr fileExistsAtPath:fullSubPath isDirectory:&dir];
              if (dir == NO){//是文件
                     NSDictionary *attr = [mgr attributesOffItemAtPath:fullSubPath error:ni];
                     totalByteSize += [attr[NSFileSize] integerValue];
               }
          }
           return totalByteSize;
      } else{//是文件
            NSDictionary *attr = [mgr attributesOffItemAtPath:self error:ni];
             return [attr[NSFileSize] integerValue];
     }
  }

第二部分: 清除缓存

#  清除指定路径下的文件
- (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];
            
        }
        
        NSLog(@"完成缓存清除");
    }
   
}


#  SDImage第三方清除缓存的方法
[[SDImageCache sharedImageCache] clearDisk];
[[SDImageCache sharedImageCache] clearMemory];


# 使用线程清除缓存的方法
dispatch_async(
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

  NSString *cachPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory,
  NSUserDomainMask, YES) objectAtIndex:0];
  NSLog(@"%@", cachPath);

  NSArray *files = [[NSFileManager defaultManager] subpathsAtPath:cachPath];
  NSLog(@"files :%d",[files count]);
  for (NSString *p in files) {
  
    NSError *error;

    NSString *path = [cachPath stringByAppendingPathComponent:p];

    if ([[NSFileManager defaultManager] fileExistsAtPath:path]) {

        [[NSFileManager defaultManager] removeItemAtPath:path error:&error];

    }

  }

  [self performSelectorOnMainThread:@selector(clearCacheSuccess) withObject:nil waitUntilDone:YES];});

}

-(void)clearCacheSuccess

{

NSLog(@"清理成功");

}

你可能感兴趣的:(NSFileManager 清除缓存功能)