Objective-C使用NSFileHandle类对文件进行基本操作,IOS文件操作

Objective-C使用NSFileHandle类对文件进行基本操作,iOS文件操作

NSFileHandle类中得方法可以对文件进行基本的读写,偏移量的操作。
NSFileHandle基本步骤:
1、打开文件,获取一个NSFileHandle对象。
2、对打开NSFileHandle的文件对象行I/O操作
3、关闭文件对象

NSFileHandle常用方法:

+(NSFileHandle*)fileHandleForReadingAtPath:path 打开一个文件用于读入

+(NSFileHandle*)fileHandleForWritingAtPath:path 打开一个文件用于写入

+(NSFileHandle*)fileHandleForUpdatingAtPath:path 打开一个文件用于读写

-(NSData*)availableData 从设备或者通道返回可用数据

-(NSData*)readDataToEndOfFile 读取其余的数据知道文件的末尾(最多UINT_MAX字节)

-(NSData*)readDataOfLength:(NSUInteger)bytes 从文件中读取指定字节的内容

-(void)writeData:data  将data写入文件

-(unsigned long long)offsetInFile 获取当前偏移量

-(void)seekToFileOffset:offset  设置偏移量

-(unsigned long long)seekToEndOfFile 将偏移量定位到文件的末尾

-(void)truncateFileAtOffset:offset  将文件的长度设置为offset字节

-(void)closeFile 关闭文件

方法fileHandleForWritingAtPath和fileHandleForUpdatingAtPath所指定的文件必须是已经存在的,否则返回nil,另外对于这两个方法中文件的偏移量都是为文件的开始。

方法readDataToEndOfFile每次从文件中读取最多UNIT_MAX字节的数据,这个量定义在
<limits.h>中。

在UNIX系统下编程打开文件进行写入并不会截断文件,需要自己完成截断


1、实例程序,通过程序对文件进行一些基本操作,很久以前的代码:

  1. #import <Foundation/Foundation.h>  

  1. int main(int argc, const charchar * argv[])  
  2. {  
  1.  @autoreleasepool {  
  2.         NSFileHandle *inFile,*outFile;  
  3.         NSData *buffer;  
  4.         NSString *fileContent = @"这些是文件内容,这些是文件内容,这些是文件内容,这些是文件内容,这些是文件内容";  
  5.         NSFileManager *fm = [NSFileManager defaultManager];  
  6.           
  7.         //创建一个文件  
  8.         [fm createFileAtPath:@"testFile.txt" contents:[fileContent dataUsingEncoding:NSUTF8StringEncoding] attributes:nil];  
  9.         //创建一个需要写入的文件  
  10.         [fm createFileAtPath:@"outFile.txt" contents:nil attributes:nil];  
  11.           
  12.         //读取文件  
  13.         inFile = [NSFileHandle fileHandleForReadingAtPath:@"testFile.txt"];  
  14.         //写入文件  
  15.         outFile = [NSFileHandle fileHandleForWritingAtPath:@"outFile.txt"];  
  16.           
  17.         if(inFile!=nil){  
  18.             //读取文件内容  
  19.             buffer = [inFile readDataToEndOfFile];  
  20.               
  21.             //将文件的字节设置为0,因为他可能包含数据  
  22.             [outFile truncateFileAtOffset:0];  
  23.               
  24.             //将读取的内容内容写到outFile.txt中  
  25.             [outFile writeData:buffer];  
  26.               
  27.             //关闭输出  
  28.             [outFile closeFile];  
  29.               
  30.             //验证outFile内容  
  31.             NSLog(@"%@",[NSString stringWithContentsOfFile:@"outFile.txt" encoding:NSUTF8StringEncoding error:NULL]);  
  32.               
  33.               
  34.             //创建一个新的文件用来循环写入  
  35.             [fm createFileAtPath:@"outFile2.txt" contents:nil attributes:nil];  
  36.               
  37.             //打开一个新的输出  
  38.             outFile = [NSFileHandle fileHandleForWritingAtPath:@"outFile2.txt"];  
  39.               
  40.             //设置一个循环写入10条数据,每条数据都再后面添加上而不是覆盖  
  41.             for (int i = 0; i<10; i++) {  
  42.                 //将偏移量设置为文件的末尾  
  43.                 [outFile seekToEndOfFile];  
  44.                 //写入数据  
  45.                 [outFile writeData:buffer];  
  46.             }  
  47.               
  48.             //验证内容  
  49.             NSLog(@"outFile2:%@",[NSString stringWithContentsOfFile:@"outFile2.txt" encoding:NSUTF8StringEncoding error:NULL]);  
  50.               
  51.             //关闭所有  
  52.             [outFile closeFile];  
  53.             [inFile closeFile];  
  54.               
  55.               
  56.         }  
  57.          
  58.           
  59.     }  
  60.     return 0;  
  61. }  


+ (NSData *) loadFileDataWithName:(NSString *)fileName

{

    if (!fileName) {

        TDMLogDebug(@"loadFileDataWithName fileName is nil.");

        returnnil;

    }

    

    NSData *data =nil;

    NSString * fileFullName = [NSHomeDirectory()stringByAppendingPathComponent:VOICEFILE_PATH];

    fileFullName = [fileFullName stringByAppendingPathComponent:fileName];

    NSFileManager *fm = [NSFileManagerdefaultManager];

    NSFileHandle *fileHandle =nil;

    @try {

        if (fm && fileFullName && [fmfileExistsAtPath:fileFullName]) {

            fileHandle = [NSFileHandlefileHandleForReadingAtPath:fileFullName];

            if (fileHandle) {

                data = [fileHandle readDataToEndOfFile];

                TDMLogDebug(@"loaded file name:%@ full:%@", fileName, fileFullName);

            } else {

                TDMLogError(@"Can't open file handle %@", fileName);

            }

        } else {

            TDMLogError(@"Error file access. FileManager:%@ FullPath:%@", fm, fileFullName);

        }

    }

    @catch (NSException *exception) {

        TDMLogError(@"Error load file name:%@ full:%@", fileName, fileFullName);

    }

    @finally {

        if (fileHandle) {

            [fileHandle closeFile];

        }

    }

    return data;

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值