cdts/xdts-ios 3/Pods/DDWriteFileManager/WriteFileSupportSpec/Classes/DDWriteFileSupport.m

599 lines
20 KiB
Mathematica
Raw Normal View History

2023-07-27 09:20:00 +08:00
//
// DDWriteFileSupport.m
// ResultContained
//
// Created by on 15/8/17.
// Copyright (c) 2015 . All rights reserved.
//
/**
1:DocumentsiTunes
2:tmpiTunes退
3:Library/CachesiTunes退
*/
#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 <NSString *> *)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 <NSString *> *)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