// // DDWriteFileSupport.m // ResultContained // // Created by 李胜书 on 15/8/17. // Copyright (c) 2015年 李胜书. All rights reserved. // /** 1:Documents:应用中用户数据可以放在这里,iTunes备份和恢复的时候会包括此目录 2:tmp:存放临时文件,iTunes不会备份和恢复此目录,此目录下文件可能会在应用退出后删除 3:Library/Caches:存放缓存文件,iTunes不会备份此目录,此目录下文件不会在应用退出删除 */ #import "DDWriteFileSupport.h" #import "NSString+DDWriteExt.h" @interface DDWriteFileSupport() @property (nonatomic,strong) NSCache *fileCache; @end; @implementation DDWriteFileSupport + (DDWriteFileSupport *) ShareInstance { static DDWriteFileSupport *sharedWriteFileInstance = nil; static dispatch_once_t predicate; dispatch_once(&predicate, ^{ sharedWriteFileInstance = [[self alloc] init]; }); return sharedWriteFileInstance; } #pragma mark - Main Methods - (nullable NSString *)searchFileByUrl:(nullable NSString *)url filed:(DDFileField)filed { if (!url) return nil; switch (filed) { case DDFieldDocuments: { NSString *documentPath = [self getDocPath]; return [documentPath stringByAppendingPathComponent:[url DDWrite_md5Mod16]]; } break; case DDFieldLibraryCaches: { NSString *libPath = [self getLibPath]; return [libPath stringByAppendingPathComponent:[url DDWrite_md5Mod16]]; } break; case DDFieldTemp: { NSString *tempPath = [self getTempPath]; return [tempPath stringByAppendingPathComponent:[url DDWrite_md5Mod16]]; } break; default: { NSString *documentPath = [self getDocPath]; return [documentPath stringByAppendingPathComponent:[url DDWrite_md5Mod16]]; } break; } } - (nullable NSString *)searchFileByUrl:(nullable NSString *)url dirName:(nullable NSString *)dirName filed:(DDFileField)filed { if (!url) return nil; switch (filed) { case DDFieldDocuments: { NSString *documentPath = [self getDocPath]; return [[documentPath stringByAppendingPathComponent:dirName] stringByAppendingPathComponent:[url DDWrite_md5Mod16]]; } break; case DDFieldLibraryCaches: { NSString *libPath = [self getLibPath]; return [[libPath stringByAppendingPathComponent:dirName] stringByAppendingPathComponent:[url DDWrite_md5Mod16]]; } break; case DDFieldTemp: { NSString *tempPath = [self getTempPath]; return [[tempPath stringByAppendingPathComponent:dirName] stringByAppendingPathComponent:[url DDWrite_md5Mod16]]; } break; default: { NSString *documentPath = [self getDocPath]; return [[documentPath stringByAppendingPathComponent:dirName] stringByAppendingPathComponent:[url DDWrite_md5Mod16]]; } break; } } - (nullable NSString *)searchFileByFileName:(nullable NSString *)name filed:(DDFileField)filed { if (!name) return nil; switch (filed) { case DDFieldDocuments: { NSString *documentPath = [self getDocPath]; return [documentPath stringByAppendingPathComponent:name]; } break; case DDFieldLibraryCaches: { NSString *libPath = [self getLibPath]; return [libPath stringByAppendingPathComponent:name]; } break; case DDFieldTemp: { NSString *tempPath = [self getTempPath]; return [tempPath stringByAppendingPathComponent:name]; } break; default: { NSString *documentPath = [self getDocPath]; return [documentPath stringByAppendingPathComponent:name]; } break; } } - (nullable NSString *)searchFileByFileName:(nullable NSString *)name dirName:(nullable NSString *)dirName filed:(DDFileField)filed { if (!name) return nil; switch (filed) { case DDFieldDocuments: { NSString *documentPath = [self getDocPath]; return [[documentPath stringByAppendingPathComponent:dirName] stringByAppendingPathComponent:name]; } break; case DDFieldLibraryCaches: { NSString *libPath = [self getLibPath]; return [[libPath stringByAppendingPathComponent:dirName] stringByAppendingPathComponent:name]; } break; case DDFieldTemp: { NSString *tempPath = [self getTempPath]; return [[tempPath stringByAppendingPathComponent:dirName] stringByAppendingPathComponent:name]; } break; default: { NSString *documentPath = [self getDocPath]; return [[documentPath stringByAppendingPathComponent:dirName] stringByAppendingPathComponent:name]; } break; } } - (nullable NSMutableArray *)readDirPath:(nullable NSString *)dirPath { __block NSMutableArray *filePaths = [@[] mutableCopy]; NSFileManager *fileManager = [NSFileManager defaultManager]; NSError *error = nil; //fileList便是包含有该文件夹下所有文件的文件名及文件夹名的数组 NSArray *fileList = [fileManager contentsOfDirectoryAtPath:dirPath error:&error]; [fileList enumerateObjectsUsingBlock:^(NSString *path, NSUInteger idx, BOOL * _Nonnull stop) { NSString *picturePath = [dirPath stringByAppendingPathComponent:path]; picturePath ? [filePaths addObject:picturePath] : nil; }]; return filePaths; } - (nullable NSArray *)readDirNames:(nullable NSString *)dirPath { NSFileManager *fileManager = [NSFileManager defaultManager]; //在这里获取应用程序Documents文件夹里的文件及文件夹列表 NSError *error = nil; NSArray *fileList = [[NSArray alloc] init]; //fileList便是包含有该文件夹下所有文件的文件名及文件夹名的数组 fileList = [fileManager contentsOfDirectoryAtPath:dirPath error:&error]; return fileList; } - (BOOL)directWriteFile:(nonnull NSString *)path data:(nonnull id)data { if (!data) return NO; NSFileManager *fileManager = [NSFileManager defaultManager]; BOOL res = NO; if ([data isKindOfClass:[NSDictionary class]] || [data isKindOfClass:[NSArray class]]) { NSData *myData = [NSKeyedArchiver archivedDataWithRootObject:data]; res = [fileManager createFileAtPath:path contents:myData attributes:nil]; } else if ([data isKindOfClass:[UIImage class]]) { NSData *myData = [self transformPNG:data]; res = [fileManager createFileAtPath:path contents:myData attributes:nil]; } else { res = [fileManager createFileAtPath:path contents:data attributes:nil]; } if (res) { if (!_fileCache) { _fileCache = [[NSCache alloc]init]; } if (path) { [_fileCache setObject:data forKey:path]; } } return res; } - (BOOL)directWriteFile:(nonnull NSString *)path img:(nonnull UIImage *)img imageType:(DDImgType)imgType { NSData *imgData = [self getImageData:img DDImgType:imgType]; return [self directWriteFile:path data:imgData]; } - (BOOL)writeFile:(nonnull NSString *)path data:(nonnull id)data { if (!data) return NO; NSFileManager *fileManager = [NSFileManager defaultManager]; BOOL res = NO; NSData *myData; if(![fileManager fileExistsAtPath:path]) { if ([data isKindOfClass:[NSDictionary class]] || [data isKindOfClass:[NSArray class]]) { myData = [NSKeyedArchiver archivedDataWithRootObject:data]; res = [fileManager createFileAtPath:path contents:myData attributes:nil]; } else if ([data isKindOfClass:[UIImage class]]) { myData = [self transformPNG:data]; res = [fileManager createFileAtPath:path contents:myData attributes:nil]; } else { myData = data; res = [fileManager createFileAtPath:path contents:myData attributes:nil]; } } if (res) { if (!_fileCache) { _fileCache = [[NSCache alloc]init]; } if (path) { [_fileCache setObject:myData forKey:path]; } } return res; } - (BOOL)writeFile:(nonnull NSString *)path img:(nonnull UIImage *)img imageType:(DDImgType)imgType { NSData *imgData = [self getImageData:img DDImgType:imgType]; return [self writeFile:path data:imgData]; } - (BOOL)directWriteFileType:(nonnull NSString *)path data:(nonnull id)data field:(DDFileField)field { NSString *finalPath = [self getAbPath:path fileField:field]; return [self directWriteFile:finalPath data:data]; } - (BOOL)directWriteFileType:(nonnull NSString *)path img:(nonnull UIImage *)img imageType:(DDImgType)imgType field:(DDFileField)field { NSData *imgData = [self getImageData:img DDImgType:imgType]; return [self directWriteFileType:path data:imgData field:field]; } - (BOOL)writeFileType:(nonnull NSString *)path data:(nonnull id)data field:(DDFileField)field { NSString *finalPath = [self getAbPath:path fileField:field]; return [self writeFile:finalPath data:data]; } - (BOOL)writeFileType:(nonnull NSString *)path img:(nonnull UIImage *)img imageType:(DDImgType)imgType field:(DDFileField)field { NSData *imgData = [self getImageData:img DDImgType:imgType]; return [self writeFileType:path data:imgData field:field]; } - (BOOL)createDir:(nonnull NSString *)dirName filed:(DDFileField)field { NSString *finalPath = [self getAbPath:dirName fileField:field]; NSFileManager *fileManager = [NSFileManager defaultManager]; BOOL res = [fileManager createDirectoryAtPath:finalPath withIntermediateDirectories:YES attributes:nil error:nil]; return res; } - (BOOL)removeFile:(nonnull NSString *)filePath { if (!filePath) return NO; NSFileManager *fileMgr = [NSFileManager defaultManager]; NSError *err; BOOL result = NO; BOOL bRet = [fileMgr fileExistsAtPath:filePath]; if (bRet) result = [fileMgr removeItemAtPath:filePath error:&err]; if (result) { if (!_fileCache) { _fileCache = [[NSCache alloc]init]; } if (filePath) { [_fileCache removeObjectForKey:filePath]; } } return result; } - (BOOL)removeDirFiles:(nonnull NSString *)dirPath { if (!dirPath) return NO; NSFileManager *fileMgr = [NSFileManager defaultManager]; NSArray *filePaths = [self readDirPath:dirPath]; __block BOOL result = NO; if (filePaths.count > 0) { result = YES; } [filePaths enumerateObjectsUsingBlock:^(NSString *filePath, NSUInteger idx, BOOL * _Nonnull stop) { BOOL bRet = [fileMgr fileExistsAtPath:filePath]; BOOL removeResult = NO; NSError *err; if (bRet) removeResult = [fileMgr removeItemAtPath:filePath error:&err]; if (!removeResult) { result = NO; *stop = YES; } }]; return result; } - (id)readFile:(nonnull NSString *)filePath fileType:(DDFileType)type { if (!filePath) return nil; BOOL isExist; if (!_fileCache) { _fileCache = [[NSCache alloc]init]; } if ([_fileCache objectForKey:filePath]) { NSData *tempData = [_fileCache objectForKey:filePath]; switch (type) { case DDFileTypeImage: { UIImage *fileImg = [UIImage imageWithData:tempData]; return fileImg; } case DDFileTypeArray: { NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithData:tempData]; return array; } case DDFileTypeDictionary: { NSDictionary *dictionary = [NSKeyedUnarchiver unarchiveObjectWithData:tempData]; return dictionary; } case DDFileTypeData: { return tempData; } default: { return tempData; } } } else { NSFileManager *fileManager = [NSFileManager defaultManager]; isExist = [fileManager fileExistsAtPath:filePath]; if (isExist) { NSData *tempData = [NSData dataWithContentsOfFile:filePath]; [_fileCache setObject:tempData forKey:filePath]; switch (type) { case DDFileTypeImage: { UIImage *fileImg = [UIImage imageWithData:tempData]; return fileImg; } case DDFileTypeArray: { NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithData:tempData]; return array; } case DDFileTypeDictionary: { NSDictionary *dictionary = [NSKeyedUnarchiver unarchiveObjectWithData:tempData]; return dictionary; } case DDFileTypeData: { return tempData; } default: { return tempData; } } } else { return nil; } } } - (id)readFile:(nonnull NSString *)filePath fileType:(DDFileType)type fileField:(DDFileField)field { NSString *finalPath = [self getAbPath:filePath fileField:field]; return [self readFile:finalPath fileType:type]; } - (void)flushCache { [_fileCache removeAllObjects]; } - (float)countFileSize:(nullable NSString *)filePath fileSizeType:(DDSizeType)type { if (!filePath) return 0; NSFileManager *manager = [NSFileManager defaultManager]; float size = 0; if ([manager fileExistsAtPath:filePath]) { size = [[manager attributesOfItemAtPath:filePath error:nil] fileSize]; } switch (type) { case DDSizeTypeKB: size = size/1024.0; break; case DDSizeTypeMB: size = size/(1024.0*1024.0); break; case DDSizeTypeGB: size = size/(1024.0*1024.0*1024.0); break; case DDSizeTypeTB: size = size/(1024.0*1024.0*1024.0*1024.0); break; default: size = size/1024.0; break; } return size; } - (float)countFileSize:(nullable NSString *)filePath field:(DDFileField)field fileSizeType:(DDSizeType)type { NSString *finalPath = [self getAbPath:filePath fileField:field]; return [self countFileSize:finalPath fileSizeType:type]; } - (float)countDirSize:(nullable NSString *)dirPath fileSizeType:(DDSizeType)type { if (!dirPath) return 0; __block float size = 0; NSFileManager *manager = [NSFileManager defaultManager]; if ([manager fileExistsAtPath:dirPath]) { NSArray *dirArr = [self readDirPath:dirPath]; [dirArr enumerateObjectsUsingBlock:^(NSString *file, NSUInteger idx, BOOL * _Nonnull stop) { size += [self countFileSize:file fileSizeType:type]; }]; } return size; } - (float)countDirSize:(nullable NSString *)dirPath field:(DDFileField)field fileSizeType:(DDSizeType)type { NSString *finalPath = [self getAbPath:dirPath fileField:field]; return [self countDirSize:finalPath fileSizeType:type]; } #pragma mark - Support Methods /** 通过选择的相对位置获取绝对路径 @param filePath 相对路径 @param field 选择位置 @return 返回绝对路径 */ - (NSString *)getAbPath:(NSString *)filePath fileField:(DDFileField)field { ///选择的路径位置 NSString *typePath; switch (field) { case DDFieldDocuments: { typePath = [self getDocPath]; } break; case DDFieldLibraryCaches: { typePath = [self getCachePath]; } break; case DDFieldTemp: { typePath = [self getTempPath]; } break; default: break; } NSString *finalPath = [typePath stringByAppendingPathComponent:filePath]; return finalPath; } - (NSData *)getImageData:(UIImage *)image DDImgType:(DDImgType)imgType { NSData *imgData; switch (imgType) { case DDImgTypePNG: imgData = [self transformPNG:image]; break; case DDImgTypeJPEG: imgData = [self transformJEPG:image]; break; default: imgData = [self transformPNG:image]; break; } return imgData; } /** 剪切图片为目标size @param targetSize 目标size @param sourceImage 源图片 @return 返回剪切后的图片 */ - (UIImage *)imageByScalingProportionallyToSize:(CGSize)targetSize sourceImage:(UIImage *)sourceImage { UIGraphicsBeginImageContext(targetSize); [sourceImage drawInRect:CGRectMake(0, 0, targetSize.width, targetSize.height)]; UIImage* scaledImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return scaledImage; } ///PNG to Data - (NSData *)transformPNG:(UIImage *)image { NSData *insertPngImageData = UIImagePNGRepresentation(image); return insertPngImageData; } ///JEPG to Data - (NSData *)transformJEPG:(UIImage *)image { NSData *insertJepgImageData = UIImageJPEGRepresentation(image,1.0); return insertJepgImageData; } ///获取documents路径 - (NSString *)getDocPath { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; return documentsDirectory; } ///获取Library目录 - (NSString *)getLibPath { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES); NSString *libraryDirectory = [paths objectAtIndex:0]; return libraryDirectory; } ///获取Cache目录 - (NSString *)getCachePath { NSArray *cacPath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); NSString *cachePath = [cacPath objectAtIndex:0]; return cachePath; } ///获取Tmp目录 - (NSString *)getTempPath { NSString *tmpDirectory = NSTemporaryDirectory(); return tmpDirectory; } @end