#import <Foundation/Foundation.h>
@interface ZJFileManager : NSObject
/** 创建文件夹
* @param folderName 文件夹名称
* return self 文件操作对象
*/
+(instancetype)createFolderWithFolderName:(NSString *)folderName;
/** 删除文件夹
*/
- (void)deleteFolder;
/** 写入文件
* @param data 文件内容
* @param fileName 文件名(文件唯一标示)
*/
- (void)writeFileData:(NSData*)data WithFileName:(NSString*)fileName;
/** 读取文件
* @param fileName 文件名(文件唯一标示)
* return data 文件内容
*/
- (void)readFileContentWithFileName:(NSString *)fileName resultBlock:(void(^)(NSData*data))block;
/** 删除文件
* @param fileName 文件名(文件唯一标示)
*/
- (void)deleteFileWithFileName:(NSString *)fileName;;
/** 单个文件大小
* @param fileName 文件名(文件唯一标示)
* return size 文件内容大小(M)
*/
- (CGFloat)fileSizeWithFileName:(NSString *)fileName;
/** 整个文件夹中所有文件大小
* return size 文件内容大小(M)
*/
- (CGFloat)folderSize;
/** 文件夹下文件个数
* return count 文件文件个数
*/
- (NSInteger)fileCount;
@end
/*
文件管理器(NSFileManager):此类主要是对文件进行的操作(创建/删除/改名等)以及文件信息的获取。
文件连接器(NSFileHandle) :此类主要是对文件内容进行读取和写入操作。
*/
/*
文件管理器:
1、创建文件管理器对象 NSFileManager = [NSFileManager defaultManager];
2、创建一个文件并写入数据 - (BOOL)createFileAtPath:(NSString *)path contents:(NSData *)data attributes:(NSDictionary *)dic;
3、从一个文件中读取数据 - (NSData *)contentsAtPath:(NSString *)path;
4、srcPath路径上的文件移动到desPath路径上。(注意这里的路径是文件路径而不是目录) - (BOOL)moveItemAtPath:(NSString *)srcPath toPath:(NSString *)desPath error:(NSError *)error;
文件连接器:
1、打开一个文件准备读取 + (id)fileHandleForReadingAtPath:(NSString *)path;
2、打开一个文件准备写入 + (id)fileHandleForWritingAtPath:(NSString *)path;
3、打开一个文件准备更新 + (id)fileHandleForUpdatingAtPath:(NSString *)path;
4、从设备或通道返回可用的数据 - (NSData *)availableData;
5、从当前的节点读取到文件的末尾 - (NSData *)readDataToEndOfFile;
6、从当前的节点开始读取指定的长度数据 - (NSData *)readDataOfLength:(NSUInteger)length;
7、写入数据 - (void)writeData:(NSData *)data;
8、获取当前文件的偏移量 - (unsigned long long)offsetInFile;
9、跳到指定文件的偏移量 - (void)seekToFileOffset:(unsigned long long)offset;
10、跳到文件末尾 - (unsigned long long)seekToEndOfFile;
11、将文件的长度设为offset字节 - (void)truncateFileAtOffset:(unsigned long long)offset;
12、关闭文件 - (void)closeFile;
*/
/*
Document:保存应用运行时生成的需要持久化的数据,iTunes会自动备份该目录,苹果建议将程序中建立的或在程序中浏览到的文件数据保存在该目录下,iTunes备份和恢复的时候会包括此目录。
NSString * documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES) firstObject];
tmp:保存应用运行时所需的临时数据,使用完毕后再将相应的文件从该目录删除。应用没有运行时,系统也有可能会清除该目录下的文件,iTunes不会同步该目录,iPhone重启时,该目录下的文件会丢失。
Library:存储程序的默认设置和其他状态信息,iTunes会自动备份该目录。
NSArray * libraryPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) firstObject];
Library/Caches:存放缓存文件,iTunes不会备份此目录,此目录下文件不会在应用退出删除。一般存放体积比较大,不是特别重要的资源。
NSString * cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask, YES)firstObject];
Library/Preferences:保存应用的所有偏好设置,iOS的Settings(设置)应用会在该目录中查找应用的设置信息,iTunes会自动备份该目录。
*/
@interface ZJFileManager()
@property(nonatomic,strong)NSString * folderPath;
@end
@implementation ZJFileManager
/** 创建文件夹
*/
+(instancetype)createFolderWithFolderName:(NSString *)folderName{
ZJFileManager * manager = [[self alloc] init];
dispatch_async(dispatch_get_global_queue(0, 0), ^{
manager.folderPath = [manager folderPathWithFolderName:folderName];
});
//NSLog(@"folderPath = %@",manager.folderPath);
return manager;
}
/** 删除文件夹
*/
- (void)deleteFolder{
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSFileManager *fileManager=[NSFileManager defaultManager];
if ([fileManager fileExistsAtPath:self.folderPath]) {
//删除整个目录
[fileManager removeItemAtPath:self.folderPath error:nil];
}
});
}
/** 写入文件
*/
- (void)writeFileData:(NSData*)data WithFileName:(NSString*)fileName{
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSString * filePath = [self filePathWithFileName:fileName];
[data writeToFile:filePath atomically:YES];
});
}
/** 读取文件
*/
-(void)readFileContentWithFileName:(NSString *)fileName resultBlock:(void (^)(NSData *data))block{
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSString * filePath = [self filePathWithFileName:fileName];
NSData * data = [NSData dataWithContentsOfFile:filePath];
dispatch_async(dispatch_get_main_queue(), ^{
if(block){block(data);}
});
});
}
/** 删除文件
*/
- (void)deleteFileWithFileName:(NSString *)fileName{
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSString * filePath = [self filePathWithFileName:fileName];
NSFileManager *fileManager=[NSFileManager defaultManager];
if ([fileManager fileExistsAtPath:filePath]) {
[fileManager removeItemAtPath:filePath error:nil];
}
});
}
/** 单个文件大小
*/
-(CGFloat)fileSizeWithFileName:(NSString *)fileName{
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString * filePath = [self filePathWithFileName:fileName];
CGFloat fileSize = 0.00;
if ([fileManager fileExistsAtPath:filePath]) {
fileSize = [[fileManager attributesOfItemAtPath:filePath error:nil] fileSize];
fileSize = fileSize / 1024.00;
}
return fileSize;
}
/** 整个文件夹中所有文件大小
*/
-(CGFloat)folderSize{
NSFileManager *fileManager = [NSFileManager defaultManager];
CGFloat folderSize = 0.00;
if ([fileManager fileExistsAtPath:self.folderPath]) {
NSArray * fileNames = [fileManager subpathsAtPath:self.folderPath];
for(NSString * fileName in fileNames){
NSString * filePath = [self.folderPath stringByAppendingPathComponent:fileName];
folderSize += [[fileManager attributesOfItemAtPath:filePath error:nil] fileSize];;
}
folderSize = folderSize/(1024.00*1.00);
}
return folderSize;
}
/** 文件夹下文件个数
*/
-(NSInteger)fileCount{
NSFileManager *fileManager = [NSFileManager defaultManager];
NSInteger count = 0;
if ([fileManager fileExistsAtPath:self.folderPath]) {
count = [[fileManager subpathsAtPath:self.folderPath] count];
}
return count;
}
#pragma mark - 文件路径
-(NSString *)filePathWithFileName:(NSString *)fileName{
fileName = [self handlePathWithOldPath:fileName];
NSString * filePath = [self.folderPath stringByAppendingPathComponent:fileName];
return filePath;
}
-(NSString *)handlePathWithOldPath:(NSString *)oldPath{
oldPath = [oldPath stringByReplacingOccurrencesOfString:@"/"withString:@""];
oldPath = [oldPath stringByReplacingOccurrencesOfString:@"'\'" withString:@""];
return oldPath;
}
#pragma mark 文件夹路径
-(NSString*)folderPathWithFolderName:(NSString*)folderName{
// 获取Caches目录路径
NSString * cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask, YES)firstObject];
NSFileManager *fileManager = [NSFileManager defaultManager];
// 判断目录下是否存在 文件夹
if (![fileManager fileExistsAtPath:[cachesPath stringByAppendingPathComponent:folderName]]) {
// 在目录下创建 文件夹
[fileManager createDirectoryAtPath:[cachesPath stringByAppendingPathComponent:folderName] withIntermediateDirectories:YES attributes:nil error:nil];
}
return [cachesPath stringByAppendingPathComponent:folderName];;
}
@end