//
// LeeFileManager.h
// WEIXUE_IOS
//
// Created by apple on 15/7/2.
// Copyright (c) 2015年 李重阳. All rights reserved.
//
#import <Foundation/Foundation.h>
/*
* 文件的根目录的路径
*/
typedef NS_ENUM(NSInteger, FileType) {
FileTypeDocument = 0,//获取Document目录
FileTypeLibrary,//获取Library目录
FileTypeCache//获取Cache目录
};
/*
* 目录的资源类型
*/
typedef NS_ENUM(NSInteger, ResourceType) {
ResourceTypePic, // 图片
ResourceTypeVideo,// 视频
ResourceTypeAudio,// 音频
ResourceTypeOther // 其他类型
};
#define fileManagerDefault [NSFileManager defaultManager]
@interface LeeFileManager : NSObject
/*
* 获得Document,Library,Cache 中其中一个类型
*
*/
+ (NSString *)getDirectoryWithType:(FileType)fileType;
/**
* 创建文件夹
*
* @param type 文件的目录
* @param folderName 新创建的文件夹的名字
* 如果 要创建 连续的 文件 夹 eg BOOK/BOOK1 就会创建两个文件夹
*
* @return 文件夹的路径
*/
+ (NSString *)createFileWithType:(FileType)type folderName:(NSString *)folderName;
/**
* 根据资源类型找到该路径
*
* @param type 资源类型
*
* @return 资源类型的路径
*/
+ (NSString *)pathOfResourceType:(ResourceType)type;
/**
* 写入文件
*
* @param type 资源文件路径
* @param fileName 写入的文件名称
* @param data data 类型的文件
*
* @return 是否写入成功
*/
+ (BOOL)writeFileWithResourceType:(ResourceType)type fileName:(NSString *)fileName data:(NSData *)data;
/**
* 删除文件
*
* @param type 资源文件路径
* @param fileName 写入的文件名称
*
* @return 是否删除成功
*/
+ (BOOL)deleteFileWithResourceType:(ResourceType)type fileName:(NSString *)fileName;
/**
* 读取文件
*
* @param type 资源文件路径
* @param fileName 写入的文件名称
*
* @return 读取文件的内容
*/
+ (NSData *)readFileWithResourceType:(ResourceType)type fileName:(NSString *)fileName;
/**
* 清除 Resource 文件中 超时的文件
* 在 - (void)applicationWillTerminate:(UIApplication *)application 中调用
*/
+ (void)cleanResourceDisk;
@end
//
// LeeFileManager.m
// WEIXUE_IOS
//
// Created by apple on 15/7/2.
// Copyright (c) 2015年 李重阳. All rights reserved.
//
#import "LeeFileManager.h"
//60 * 60 * 24 * 7; // 1 week
static const CGFloat maxCacheAge = 1; //生命周期
@implementation LeeFileManager
/*
* 获得Documents,Library,Cache 中其中一个类型
*
*/
+ (NSString *)getDirectoryWithType:(FileType)fileType {
NSUInteger type = NSDocumentDirectory;
if (fileType == FileTypeDocument) {
type = NSDocumentDirectory;
}else if (fileType == FileTypeLibrary){
type = NSLibraryDirectory;
}else{
type = NSCachesDirectory;
}
NSArray *paths = NSSearchPathForDirectoriesInDomains(type, NSUserDomainMask, YES);
NSString *directory = [paths objectAtIndex:0];
return directory;
}
/*
* 创建文件夹
*/
+ (NSString *)createFileWithType:(FileType)type folderName:(NSString *)folderName {
NSString *directory =[LeeFileManager getDirectoryWithType:type];
NSString *fileDirectory = [directory stringByAppendingPathComponent:folderName];
// 其实这里不判断也是可以的,如果有相同的文件 ,系统会自动 保留以前的文件夹
if ([fileManagerDefault fileExistsAtPath:fileDirectory]) {
NSLog(@"文件已存在");
} else {
NSError *error = nil;
//创建文件夹
BOOL res = [fileManagerDefault createDirectoryAtPath:fileDirectory withIntermediateDirectories:YES attributes:nil error:&error];
//这个是创建文件资源 例如 1.text 或者没有后缀名的资源
// BOOL res=[fileManagerDefault createFileAtPath:fileDirectory contents:nil attributes:nil];
if (res) {
NSLog(@"文件创建成功: %@" ,fileDirectory);
}else{
fileDirectory = nil;
NSLog(@"文件创建失败");
}
}
return fileDirectory;
}
/**
* 根据资源类型找到该路径
*
* @param type 资源类型
*
* @return 资源类型的路径
*/
+ (NSString *)pathOfResourceType:(ResourceType)type {
NSString * fileName = nil;
if (type == ResourceTypePic) {
fileName = @"Resource/Pic";
}else if(type == ResourceTypeVideo){
fileName = @"Resource/Video";
}else if(type == ResourceTypeAudio){
fileName = @"Resource/Audio";
}else if(type == ResourceTypeOther){
fileName = @"Resource/Other";
}
NSString *path = [LeeFileManager createFileWithType:FileTypeDocument folderName:fileName];
return path;
}
/**
* 写入文件
*
* @param type 资源文件路径
* @param fileName 写入的文件名称
* @param data data 类型的文件
*
* 如果是相同的路径会直接覆盖
* @return 是否写入成功
*/
+ (BOOL)writeFileWithResourceType:(ResourceType)type fileName:(NSString *)fileName data:(NSData *)data {
NSString * path = [LeeFileManager pathOfResourceType:type];
if (fileName) {
path = [path stringByAppendingPathComponent:fileName];
}
BOOL res=[data writeToFile:path atomically:YES];
if (res) {
NSLog(@"文件写入成功");
}else {
NSLog(@"文件写入失败");
}
return res;
}
/**
* 删除文件
*
* @param type 资源文件路径
* @param fileName 写入的文件名称
*
* @return 是否删除成功
*/
+ (BOOL)deleteFileWithResourceType:(ResourceType)type fileName:(NSString *)fileName {
NSString * path = [LeeFileManager pathOfResourceType:type];
if (fileName) {
path = [path stringByAppendingPathComponent:fileName];
}
BOOL res=[fileManagerDefault removeItemAtPath:path error:nil];
if (res) {
NSLog(@"文件删除成功");
}else {
NSLog(@"文件删除失败");
}
return res;
}
/**
* 读取文件
*
* @param type 资源文件路径
* @param fileName 写入的文件名称
*
* @return 读取文件的内容
*/
+ (NSData *)readFileWithResourceType:(ResourceType)type fileName:(NSString *)fileName {
NSString * path = [LeeFileManager pathOfResourceType:type];
if (fileName) {
path = [path stringByAppendingPathComponent:fileName];
}
NSData * data = [NSData dataWithContentsOfFile:path];
return data;
}
/**
* 清除 Resource 文件中 超时的文件
*/
+ (void)cleanResourceDisk{
NSString *path = [LeeFileManager createFileWithType:FileTypeDocument folderName:@"Resource"];
NSURL *diskCacheURL = [NSURL fileURLWithPath:path isDirectory:YES];
NSArray *resourceKeys = @[NSURLIsDirectoryKey, NSURLContentModificationDateKey, NSURLTotalFileAllocatedSizeKey];
// This enumerator prefetches useful properties for our cache files.
NSDirectoryEnumerator *fileEnumerator = [fileManagerDefault enumeratorAtURL:diskCacheURL
includingPropertiesForKeys:resourceKeys
options:NSDirectoryEnumerationSkipsHiddenFiles
errorHandler:NULL];
NSDate *expirationDate = [NSDate dateWithTimeIntervalSinceNow:-maxCacheAge];
NSMutableArray *urlsToDelete = [[NSMutableArray alloc] init];
for (NSURL *fileURL in fileEnumerator) {
NSDictionary *resourceValues = [fileURL resourceValuesForKeys:resourceKeys error:NULL];
// Skip directories.
if ([resourceValues[NSURLIsDirectoryKey] boolValue]) {
continue;
}
// Remove files that are older than the expiration date;
NSDate *modificationDate = resourceValues[NSURLContentModificationDateKey];
if ([[modificationDate laterDate:expirationDate] isEqualToDate:expirationDate]) {
[urlsToDelete addObject:fileURL];
continue;
}
}
for (NSURL *fileURL in urlsToDelete) {
[fileManagerDefault removeItemAtURL:fileURL error:nil];
}
}
@end