MG--OC和Swift计算和清除缓存工具类之NSObject+FileManager.h

  • 一、OC计算和清除缓存方法

  • 使用NSObject的分类专门计算缓存,封装好的工具类。此分类中使用了多线程和Block作为回调处理。



  • h

//  NSObject+FileManager.h
//  04-MGWeChat
//  Created by ming on 14/12/21.
//  Copyright © 2014年 ming. All rights reserved.

#import 

@interface NSObject (FileManager)
/** 类方法获取文件的大小 有回调 */
+ (void)getFileSizeWithFileName:(NSString *)path completion:(void(^)(NSInteger totalSize))completionBlock;
/** 对象方法获取文件的大小 有回调 */
- (void)getFileSizeWithFileName:(NSString *)path completion:(void(^)(NSInteger totalSize))completionBlock;

/** 类方法获取caches路径 */
+ (NSString *)cachesPath;
/** 对象方法获取caches路径 */
- (NSString *)cachesPath;

/** 类方法移除caches 有回调 */
+ (void)removeCachesWithCompletion:(void(^)())completionBlock;
/** 对象方法移除caches 有回调 */
- (void)removeCachesWithCompletion:(void(^)())completionBlock;

@end
  • .m

//  NSObject+FileManager.m
//  04-MGWeChat
//  Created by ming on 14/13/21.
//  Copyright © 2014年 ming. All rights reserved.

#import "NSObject+FileManager.h"

@implementation NSObject (FileManager)

// 异步方法,不需要返回值
// 异步方法使用回调,block
// 获取文件尺寸
+ (void)getFileSizeWithFileName:(NSString *)path completion:(void(^)(NSInteger totalSize))completionBlock{
    // 在子线程中计算文件大小
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
       // 1.文件总大小
       NSInteger totalSize = 0;
       
       // 2.创建文件管理者
       NSFileManager *fileManager = [NSFileManager defaultManager];
       
       // 3.判断文件存不存在以及是否是文件夹
       BOOL isDirectory = NO;
       BOOL isFileExist = [fileManager fileExistsAtPath:path isDirectory:&isDirectory];
        
       if (!isFileExist) return; // 文件不存在
        
       if (isDirectory) { // 是文件夹
            NSArray *subPaths = [fileManager subpathsAtPath:path];
            for (NSString *subPath in subPaths) {
                 NSString *filePath = [path stringByAppendingPathComponent:subPath];
                BOOL isDirectory = NO;
                BOOL isExistFile = [fileManager fileExistsAtPath:filePath isDirectory:&isDirectory];
                if (!isDirectory && isExistFile && ![filePath containsString:@"DS"]) {
                    totalSize += [fileManager attributesOfItemAtPath:filePath error:nil].fileSize;
                }
            }
        }else{ // 不是文件夹
            totalSize = [fileManager attributesOfItemAtPath:path error:nil].fileSize ;
        }
        
        // 回到主线程
        dispatch_sync(dispatch_get_main_queue(), ^{
            if (completionBlock) {
                completionBlock(totalSize);
            }
        });
    });
}

- (void)getFileSizeWithFileName:(NSString *)path completion:(void (^)(NSInteger)) completionBlock{
    [NSObject getFileSizeWithFileName:path completion:completionBlock];
}

/** 获取路径 */
+ (NSString *)cachesPath{
    return [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
}
- (NSString *)cachesPath{
    return [NSObject cachesPath];
}

/** 删除caches */
+ (void)removeCachesWithCompletion:(void(^)())completionBlock{
    [[[NSOperationQueue alloc] init] addOperationWithBlock:^{
        // 创建文件管理者
        NSFileManager *fileManager = [NSFileManager defaultManager];
        
        // 删除文件
        NSString *path = self.cachesPath;
        
        BOOL isDirectory = NO;
        BOOL isfileExist = [fileManager fileExistsAtPath:path isDirectory:&isDirectory];
        if (!isfileExist) return ;
        if (isDirectory) {
            // 迭代器
            NSDirectoryEnumerator *enumerator = [fileManager enumeratorAtPath:path];
            for (NSString *subPath in enumerator) {
                NSString *filePath = [path stringByAppendingPathComponent:subPath];
                // 移除文件Or文件夹
                [fileManager removeItemAtPath:filePath error:nil];
            }
        }
        // 回到主线程
        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
            if (completionBlock) {
                completionBlock();
            }
        }];
    }];
}

- (void)removeCachesWithCompletion:(void(^)())completionBlock{
    [NSObject removeCachesWithCompletion:completionBlock];
}

@end



  • 二、#Swift2.x计算和清除缓存的方法
    • 使用NSObject的分类专门计算缓存,封装好的工具类。此分类中使用了多线程和闭包作为回调处理。
// NSObject+FileManager.swift
// Created by ming on 16/10/30.
// Copyright © 2016年 ming. All rights reserved.

import UIKit
/* 计算缓存  */
extension NSObject {
    /* 类方法:
       异步方法
       使用回调,block       
       获取文件尺寸
    */
    class func getFileSizeWithFileName(path: String,completionBlock:(totalSize: UInt64) -> () ) {
        // 在子线程中计算文件大小
        dispatch_async(dispatch_get_global_queue(0, 0)) { () -> Void in
                // 1.文件总大小
                var totalSize: UInt64 = 0;
                // 2.创建文件管理者
                let fileManager = NSFileManager.defaultManager()
                // 3.判断文件存不存在以及是否是文件夹
                var isDirectory: ObjCBool = ObjCBool(false)
                let isFileExist = fileManager.fileExistsAtPath(path , isDirectory: &isDirectory)

                if (!isFileExist) {return} // 文件不存在
                    if (isDirectory) { // 是文件夹
                        guard let subPaths = fileManager.subpathsAtPath(path) else { return }
                       for subPath in subPaths {
                            let filePath = path.stringByAppendingFormat("/%@", subPath)
                            var isDirectory: ObjCBool = ObjCBool(false)
                            let isExistFile = fileManager.fileExistsAtPath(filePath, isDirectory: &isDirectory)
                            if (!isDirectory && isExistFile && !filePath.containsString("DS")) {
                               if let attr: NSDictionary = try? fileManager.attributesOfItemAtPath(path) {
                                    totalSize += attr.fileSize()
                                }
                            }
                        }
               }else{ // 不是文件夹
                   if let attr: NSDictionary = try? fileManager.attributesOfItemAtPath(path) {
                       totalSize += attr.fileSize()
                   }
               }

               // 回到主线程,把计算的大小通过壁报传递出去
               dispatch_async(dispatch_get_main_queue()) { () -> Void in
                    completionBlock(totalSize: totalSize)
               }
         }
    }

     // 对象方法:根据缓存路径去计算缓存文件的大小,通过闭包返回缓存大小
    func getFileSizeWithFileName(path: String, completionBlock:(totalSize: UInt64) -> ()) {
          NSObject.getFileSizeWithFileName(path, completionBlock:completionBlock)
    }
}

 /** 获取缓存路径 */
extension NSObject {
    class func cachesPath() -> String {
        return NSSearchPathForDirectoriesInDomains(.CachesDirectory, .UserDomainMask, true).last!
    }

    func cachesPath() -> String {
        return NSObject.cachesPath()
    }
}

/** 清除缓存 */
extension NSObject {
    class func removeCachesWithCompletion(completionBlock: ()->()) {
          NSOperationQueue().addOperationWithBlock { () -> Void in
              // 创建文件管理者
              let fileManager = NSFileManager.defaultManager()

              // 删除文件
              let path = self.cachesPath() as String
              var isDirectory: ObjCBool = ObjCBool(false)
              let isFileExist = fileManager.fileExistsAtPath(path , isDirectory: &isDirectory)

              if (!isFileExist)  { return } // 文件不存在
              if (isDirectory) {
                  guard let enumerator = fileManager.enumeratorAtPath(path) else { return }
                  for subPath in enumerator {
                      let subPath = subPath as? String
                      let filePath = path.stringByAppendingFormat("/%@", subPath!)
                      // 移除文件Or文件夹
                      try! fileManager.removeItemAtPath(filePath)
                  }
              }

              // 回到主线程
              NSOperationQueue.mainQueue().addOperationWithBlock({ () -> Void in
                  completionBlock()
            })
         }
    }

    func removeCachesWithCompletion(completionBlock: ()->()) {
        NSObject.removeCachesWithCompletion(completionBlock)
    }
}



  • github

项目 简介
MGDS_Swif 逗视视频直播
MGMiaoBo 喵播视频直播
MGDYZB 斗鱼视频直播
MGDemo n多小功能合集
MGBaisi 高度仿写百思
MGSinaWeibo 高度仿写Sina
MGLoveFreshBeen 一款电商App
MGWeChat 小部分实现微信功能
MGTrasitionPractice 自定义转场练习
DBFMDemo 豆瓣电台
MGPlayer 一个播放视频的Demo
MGCollectionView 环形图片排布以及花瓣形排布
MGPuBuLiuDemo 瀑布流--商品展
MGSlideViewDemo 一个简单点的侧滑效果,仿QQ侧滑
MyResume 一个展示自己个人简历的Demo
GoodBookDemo 好书
  • 1、直播喵播MGMiaoBo下载

  • 2、逗视:逗你玩的直播App,可下载试玩

  • 看下效果

逗视介绍1.gif

逗视介绍2.gif


  • 扫一扫,关注我

MG--OC和Swift计算和清除缓存工具类之NSObject+FileManager.h_第1张图片
扫一扫,关注我.jpg

  • 轻轻点击,关注我

    • 轻轻点击,在慕课网关注我

    • 关注我

    • 轻轻点击,关注我微博

    • 浏览我的GitHub


  • 扫一扫,关注我的公众号


    MG--OC和Swift计算和清除缓存工具类之NSObject+FileManager.h_第2张图片
    扫一扫,关注我.jpg

你可能感兴趣的:(MG--OC和Swift计算和清除缓存工具类之NSObject+FileManager.h)