博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS:NSFileHandle和NSFileManger的使用
阅读量:6944 次
发布时间:2019-06-27

本文共 8481 字,大约阅读时间需要 28 分钟。

一、介绍

利用NSFilehandle类提供的方法,允许更有效地使用文件。

一般而言,处理文件时都要经历以下三个步骤:

1.打开文件,并获取一个NSFileHandle对象,以便在后面的I/O操作中引用该文件

2.对打开的文件执行I/O操作(读取、写入、更新)

3.关闭文件

 

注意:

NSFileHandle  此类主要对文件内容进行读取和写入操作,可以使用NSFileHandle做文件的断点续传。

NSFileManger 此类主要是对文件进行的操作以及文件信息的获取

 

二、API

NSFileManger:

-(NSData *)contentsAtPath:path                                         //从一个文件读取数据-(BOOL)createFileAtPath: path contents:(NSData *)data attributes:attr  //向一个文件写入数据(能否写入由其attributes决定)-(BOOL)removeItemAtPath:path error:err                                 //删除一个文件-(BOOL)moveItemAtPath:from toPath:to error:err                        //重命名或者移动一个文件(to不能是已存在的)-(BOOL)copyItemAtPath:from toPath:to error:err                         //复制文件(to不能是已存在的)-(BOOL)contentsEqualAtPath:path andPath:path2                          //比较两个文件的内容-(BOOL)fileExistAtPath:path                                       //测试文件是否存在-(BOOL)isReadableFileAtPath:path                                 //测试文件是否存在,并且是否能执行读操作  -(BOOL)isWriteableFileAtPath:path                                //测试文件是否存在,并且是否能执行写操作  -(NSDictionary *)attributesOfItemAtPath:path error:err            //获取文件的属性  -(BOOL)setAttributesOfItemAtPath:attr error:err                  //更改文件的属性

NSFileHandle:

+ (id)fileHandleForReadingAtPath:(NSString *)path     //打开一个文件准备读取+ (id)fileHandleForWritingAtPath:(NSString *)path     //打开一个文件准备写入 + (id)fileHandleForUpdatingAtPath:(NSString *)path     //打开一个文件准备更新- (NSData *)availableData;                   //从设备或通道返回可用的数据 - (NSData *)readDataToEndOfFile;               //从当前的节点读取到文件的末尾 - (NSData *)readDataOfLength:(NSUInteger)length;      // 从当前节点开始读取指定的长度数据 - (void)writeData:(NSData *)data;                //写入数据 - (unsigned long long)offsetInFile;              //获取当前文件的偏移量 - (void)seekToFileOffset:(unsigned long long)offset;     //跳到指定文件的偏移量 - (unsigned long long)seekToEndOfFile;            //跳到文件末尾 - (void)truncateFileAtOffset:(unsigned long long)offset; //将文件的长度设为offset字节- (void)closeFile;                         //关闭文件

 

三、使用

NSFileManger基本用法: 文件创建

//初始化一个NSFileManager类defaultManager方法为单例模式,通过单例模式进行初始化NSFileManager  * fileManager =[NSFileManager defaultManager];        //拼接路径NSString * path=NSHomeDirectory();path=[path stringByAppendingPathComponent:@"deskTop/date.txt"];        //创建文件BOOL flag=[fileManager createFileAtPath:path contents:nil attributes:nil];if(flag){    NSLog(@"文件创建成功");}else{    NSLog(@"文件创建失败");}

NSFileManger基本用法: 目录创建

NSFileManager  * fileManager =[NSFileManager defaultManager];NSString * path=NSHomeDirectory();path=[path stringByAppendingPathComponent:@"deskTop/pro/cpp"];BOOL flag=[fileManager createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:nil];if(flag){    NSLog(@"创建成功");}else{    NSLog(@"创建失败");}

NSFileManger基本用法: 文件/目录删除

NSFileManager  * fileManager =[NSFileManager defaultManager];NSString * rootPath=NSHomeDirectory();NSString * dirPath=[rootPath stringByAppendingPathComponent:@"deskTop/newFolder"];NSArray * array=[fileManager contentsOfDirectoryAtPath:dirPath error:nil];for(NSString * str in array){    NSString * newPath=[dirPath stringByAppendingPathComponent:str];    BOOL flag=[fileManager removeItemAtPath:newPath error:nil];    if(flag){          NSLog(@"删除成功");     }else{          NSLog(@"删除失败");     }  }

NSFileManger基本用法: 复制或者移动文件

//将一个文件复制到另一个文件[fileManager copyItemAtPath:path1 toPath:path2 error:nil];        //将一个文件移动到另一个文件[fileManager moveItemAtPath:path1 toPath:path2 error:nil]; //获取文件里面的内容NSData * readData=[fileManager contentsAtPath:path]

NSFileHandle基本用法:  追加数据

NSString *homePath  = NSHomeDirectory( ); NSString *sourcePath = [homePath stringByAppendingPathConmpone:@"testfile.text"];                 NSFileHandle *fielHandle = [NSFileHandle fileHandleForUpdatingAtPath:sourcePath];                        [fileHandle seekToEndOfFile];  //将节点跳到文件的末尾           NSString *str = @"追加的数据"                    NSData* stringData  = [str  dataUsingEncoding:NSUTF8StringEncoding];           [fileHandle writeData:stringData]; //追加写入数据        [fileHandle closeFile];

NSFileHandle基本用法:  定位数据

NSFileManager *fm = [NSFileManager defaultManager];               NSString *content = @"abcdef";                       [fm createFileAtPath:path contents:[content dataUsingEncoding:NSUTF8StringEncoding] attributes:nil];                              NSFileHandle *fileHandle = [NSFileHandle fileHandleForReadingAtPath:path];       NSUInteger length = [fileHandle availabelData] length];// 获取数据长度        [fileHandle seekToFileOffset;length/2]; //偏移量文件的一半            NSData *data = [fileHandle readDataToEndOfFile];                 [fileHandle closeFile];

NSFileHandle基本用法:  复制文件

NSFileHandle *infile, *outfile;   //输入文件、输出文件          NSData *buffer;    //读取的缓冲数据                    NSFileManager *fileManager = [NSFileManager defaultManager];   NSString *homePath = NSHomeDirectory( );              NSString *sourcePath = [homePath  stringByAppendingPathComponent:@"testfile.txt"];   // 源文件路径                                          NSString *outPath = [homePath stringByAppendingPathComponent:@"outfile.txt"];   //输出文件路径                               BOOL sucess  = [fileManager createFileAtPath:outPath contents:nil attributes:nil];   if (!success)            {                                                           return N0;                                                                                                     }                 infile = [NSFileHandle fileHandleForReadingAtPath:sourcePath];   //创建读取源路径文件 if (infile == nil)                            {                                              return NO;                        }                           outfile = [NSFileHandle fileHandleForReadingAtPath:outPath];   //创建并打开要输出的文件if (outfile == nil)                              {                                                                     return NO;                                                      }                                             [outfile truncateFileAtOffset:0]; //将输出文件的长度设为0         buffer = [infile readDataToEndOfFile];  //读取数据           [outfile writeData:buffer];  //写入输入                        [infile closeFile];        //关闭写入、输入文件               [outfile closeFile];

 

四、实例演示

通过一个句柄,将语音识别的音频写入文件

//创建句柄- (void)configFileHandler:(NSString *)fileName {    self.fileHandler = [self createFileHandleWithName:fileName isAppend:NO];}- (NSFileHandle *)createFileHandleWithName:(NSString *)aFileName isAppend:(BOOL)isAppend {
NSFileHandle *fileHandle = nil; NSString *fileName = [self getFilePath:aFileName]; int fd = -1; if (fileName) { if ([[NSFileManager defaultManager] fileExistsAtPath:fileName]&& !isAppend) { [[NSFileManager defaultManager] removeItemAtPath:fileName error:nil]; } int flags = O_WRONLY | O_APPEND | O_CREAT; fd = open([fileName fileSystemRepresentation], flags, 0644); } if (fd != -1) { fileHandle = [[NSFileHandle alloc] initWithFileDescriptor:fd closeOnDealloc:YES]; } return fileHandle;}//存储音频#pragma mark - MVoiceRecognitionClientDelegate- (void)VoiceRecognitionClientWorkStatus:(int)workStatus obj:(id)aObj { switch (workStatus) { case EVoiceRecognitionClientWorkStatusNewRecordData: { /// 录音数据回调、NSData-原始音频数据,此处可以用来存储录音 NSData *originData = (NSData *)aObj; [self.mutabelData appendData:originData]; break; } case EVoiceRecognitionClientWorkStatusStartWorkIng: { /// 识别工作开始,开始采集及处理数据 break; } case EVoiceRecognitionClientWorkStatusStart: { /// 检测到用户开始说话 break; } case EVoiceRecognitionClientWorkStatusFlushData: { /// 连续上屏、NSDictionary-中间结果 break; } case EVoiceRecognitionClientWorkStatusFinish: { /// 语音识别功能完成,服务器返回正确结果、最终识别结果 break; } case EVoiceRecognitionClientWorkStatusError: { /// 发生错误 NSError-错误信息 break; } case EVoiceRecognitionClientWorkStatusLongSpeechEnd: { /// 长语音结束状态 [self endLongSpeechRecognition]; break; } default: break; }}//写入音频- (void)endLongSpeechRecognition{ //关闭识别服务 [self.asrEventManager sendCommand:BDS_ASR_CMD_STOP]; [self.fileHandler writeData:self.mutabelData]; self.mutabelData = nil; }//懒加载-(NSMutableData *)mutabelData{ if (!_mutabelData) { _mutabelData = [NSMutableData data]; } return _mutabelData;}

 

五、文章引用

原文链接:

原文链接:

 

转载地址:http://qninl.baihongyu.com/

你可能感兴趣的文章
十款逆天级效率工具盘点:环信移动客服上榜
查看>>
不得了 美国ISP承诺不卖用户浏览记录
查看>>
再用Wi-Fi就过时了 Li-Fi的速度是它的100倍
查看>>
雅虎泄露事故黑客遭起诉能否起到有效的震慑?
查看>>
贵州推动大数据创新试验区建设
查看>>
索尼出售广州工厂 员工停产维权求补偿
查看>>
华为员工家属:华为人收入高背后是全家人的付出
查看>>
Yahoo! Screwdriver:可扩展的持续集成工具
查看>>
Skype已死?触宝电话和微信说:“有事烧纸“
查看>>
高燕婕:解读中国“十三五”智慧医疗与健康服务业之发展
查看>>
安防在金融行业应用的未来发展趋势
查看>>
世界那么大,微信国际化
查看>>
开源SDN来势汹汹 ODL中国实战弥补人才短板
查看>>
线下渠道大热 迪信通信心爆棚要“做机”
查看>>
聚焦数字营销 看中美巨头如何玩转大数据
查看>>
汇丰银行:为什么机器学习正在加速云计算的采用
查看>>
Martin Casado预测:网络基础设施并不会消亡
查看>>
阿尔卡特朗讯企业通信发布下一代的中小企业解决方案 支持云服务
查看>>
波动之后 如何看当前光伏板块盈利与投资
查看>>
共建共享 推进大数据深度应用
查看>>