简析——NSFileManager与NSFileHandle

来源:互联网 发布:淘宝u站九块九包邮 编辑:程序博客网 时间:2024/06/07 03:06

NSFileManager(文件管理器)

对文件本身的的操作,创建文件、删除文件、移动、拷贝和遍历以及对目录操作等方面,需注意它并没有打开一个文件去修改里面的内容。

NSFileHandle(文件句柄)

是对文件内容的操作,文件句柄打开一个文件会自动生成;之后,这个文件句柄就成了文件的代表,对文件句柄的操作就是对文件操作。

 

-----NSFileManager的操作------

创建一个单例的NSFileManager对象

NSFileManager *fm = [NSFileManager defaultManager];

 

文件操作方法:

 1.从文件中读取数据
BOOL isOk = [fm contentsAtPath:path];

 

 2.创建文件

BOOL isOk = [fm createFileAtPath:(NSString*) contents:(NSData*) attributes:(NSDictionary*)];

 //参数一:创建路径;参数二:要写入的数据,一般填Nil,要写入的话使用NSFileHandle;参数三:属性,一般填nil让系统自动生成;

 

 3.删除文件

  //删除某一项,不分文件还是文件夹(目录),都可以删除;

[fm removeItemAtPath:(NSString*) error:(NSError**)];

  //删除一个文件
BOOL isOk = [fm removeFileAtPath:path handler:handler];

  

 4.拷贝文件

BOOL isOk = [fm copyItemAtPath:(NSString*) toPath:(NSString*) error:(NSError**)];

  //复制文件(to不能存在)

  //参数一:原目录(文件夹)或文件:参数二:新生成的文件或文件夹的路径;

 

 5.移动文件

 //重命名或移动(to可能已经存在),用于文件,也可用于目录;与copy类似,只是函数名更改了一下;

BOOL isOk = [fm moveItemAtPath:(NSString*) toPath:(NSString*) error:(NSError**)];

 

 6.比较两个文件的内容
BOOL isOk = [fm contentsEqualAtPath:path1 andPath:path2];

 

 7.测试文件

  //1)测试文件是否存在
BOOL isOk = [fm fileExistsAtPath:path];

  //2)测试文件是否存在,且是否能执行读操作
BOOL isOk = [fm isReadablefileAtPath:path ];

  //3)测试文件是否存在,且是否能执行写操作

BOOL isOk = [fm isWritablefileAtPath:path ];

 

 8.文件属性

  //1)获取文件的属性
NSDictionary *dict = [fm fileAttributesAtPath:path traverseLink:(BOOL)flag];

  //2)更改文件的属性

BOOL isOk = [fm changeFileAttributes:attr atPath:path ];

  

目录操作方法:

  1.创建目录

BOOL isOk = [fm createDirectoryAtPath:(NSString*) withIntemediateDirectories:(BOOL) attributes:(NSDictionaary*) error:(NSError**)];

 //参数一:创建目录的路径;参数二:是否创建中间目录;参数三:可以填nil;参数四:报错 填&error;

 

 2.获取当前目录 
NSString *str = [fm currentDirectoryPath]; 
  

      

 3.更改当前目录        

BOOL isOk = [fm changeCurrentDirectoryPath:path];    

 

 4.复制目录结构(to不能已经存在)     
BOOL isOk = [fm copyPath:from toPath:path tohandler:handler]; 
  

 

  5.测试文件是否为目录(flag存储结构yes/no)
BOOL isOk = [fm fileExistsAtPath:path isDirectory:(BOOL*)flag]; 
    

 

  6.列出目录的内容

NSArray *array = [fm contentsOfDirectoryAtPath:path];    

 

 7.枚举目录的内容     
NSDirectoryEnumerator *enumerator =[fm enumeratorAtPath:path];

 

  8.删除空目录
BOOL isOk = [fm removeFileAtPath:path handler:handler]; 
 

 

  9.重命名或移动一个目录,to不能是已经存在的

BOOL isOk = [fm movePath:from toPath:path tohandler:handler];         

      

  10.浅度遍历

  //只是遍历当前目录,对当前目录中的文件夹(目录)之下有什么内容并不会被遍历出来;

NSArray *array = [fm contentsOfDirectoryAtPath:(NSString*) error:(NSError**)];

 //参数一:目录的路径;参数二:用于报错,传指针地址&error;

  //返回数组地址,这个方法获得文件和文件夹的名字后,会把它们装进数组之中;

if(error){

   NSLog(@"%@",error); //打印error的description方法,得到错误信息

   exit(-1);           //一旦发生错误,程序终止

}

NSLog(@"%@",array);      //若无错误,前面没终止就打印这个目录下的文件和文件夹名字

 

  11.深度遍历

  //不仅遍历当前目录,对当前目录中的子目录也会遍历,同样返回数组地址;

NSArray *arrayOne = [fm subpathsOfDrictoryAtPath:path error:&error];

   

 

-----NSFileHandle的操作------

1.创建文件句柄

 对于读和写是相对cpu来说的.对cpu而言,内存属于内部存储器(相当于大脑),而硬盘是外部存储设备(相当于书本)。读:从文件(硬盘)到内存;写:从内存到文件(硬盘)。

  //1)以只读的形式打开指定位置的文件。

NSFileHandle *fhRead = [NSFileHandle fileHandleForReadingAtPath:(NSString*)];

  //2)以只写的形式打开指定位置的文件。

NSFileHandle *fhWrite = [NSFileHandle fileHandleForWritingAtPath:(NSString*)];

  //3)打开一个文件准备更新(读取和写入)
NSFileHandle *fhUpdate = [NSFileHandle fileHandleForUpdatingAtP
ath:path];          

 

2.读操作

 //1)读指定字节的数据。存在一个读指针的偏移量,每一次读取时都会接着上次读取的位置往下继续;    

NSData *data = [fhRead readDataOfLength:3];

  //2)读取其余的数据直到文件末尾(最多UINT_MAX字节);
NSData *data = [fhRead readDataToEndOfFile];

  //3)从设备或通道返回可用数据;
NSData *data = [fhRead availableData];

 

3.写操作

 //1)将data写入文件。文件里面的内容都存在,并不会自动清空,我们写的内容只会覆盖上去;

[fhWrite writeData:(NSData*)];

  //2)文件内容清空。截断文件内容至0字节;

[fhWrite truncateFileAtOffSet:0];

  //3)获取当前文件的偏移量

id current = [fhWrite offsetInFile];     

  //4)设置当前文件的偏移量
[fhWrite seekToFileOffset:offset]; 
       

  //5)文件内容追加。将读写指针都放在文件末尾;

id theEnd = [fhWrite seekToEndFile]; 

  //6)将文件的长度设置为offset字节
[fhWrite truncateFileAtOffset:offset]; 
 

 

4.关闭文件
[fhRead closeFile];

[fhWrite closeFile];

[fhUpdate closeFile];

                      

 

  

练习例子:

  //1.得到管理对象,创建文件

NSString *strFile = @" thefile.txt ";

NSString *strTextCreate = @"创建成功?";

NSFileManager *fm;

    fm = [NSFileManager defaultManager];

  //返回当前用户主目录的路径, 将thefile.txt添加到现有路径末尾 
NSString *strPath = [NSHomeDirectory() stringByAppendingPathComponent:strFile];
NSData *dataTextCreate = [strTextCreate dataUsingEncoding:NSUTF8StringEncoding];

    [fm createFileAtPath:strPath contents:dataTextCreate attributes:nil];

   

  //2.对文件读取

NSData *dataReadOne = [fm contentsAtPath:strPath];

NSString *strReadOne = [[NSString alloc] initWithData:dataReadOne encoding:NSUTF8StringEncoding];

NSLog(@"\n the new file include text:\n",strReadOne);

 

  //3.关联文件,准备写入

NSFileHandle *fhWrite = [NSFileHandle fileHandleForWritingAtPath: strPath];                   

NSString *strAdd = @"添加成功?";

NSData *dataAdd = [strAdd dataUsingEncoding:strAddencoding:NSUTF8StringEncoding];

[fhWrite seekToEndOfFile];

[fhWrite writeData:dataAdd];

[fhWrite closeFile];

 

  //4.关联文件,准备读取

NSFileHandle *fhRead = [NSFileHandle fileHandleForReadingAtPath:strPath];               

NSData *dataReadTwo = [fhRead availableData];

NSString *strReadTwo = [[NSString alloc] initWithData:dataReadTwo encoding:NSUTF8StringEncoding];

NSLog(@"\n use NSFlieHandle method read:\n %@",strReadTwo);

[fhRead closeFile];

0 0
原创粉丝点击