程序沙盒目录,下面继续来看一下操作文件的两个类

一、NSFileManager

这个类的主要功能是对文件进行操作:创建,复制,剪切,删除等

  1. #import <UIKit/UIKit.h>  
  2. #import "AppDelegate.h"  
  3.   
  4. //NSFileManager:对文件进行操作的,包括复制,粘贴,删除,剪切等操作  
  5. int main(int argc, charchar * argv[]) {  
  6.     @autoreleasepool {  
  7.           
  8.         //------------------创建文件/文件夹  
  9.         //获取沙盒目录  
  10.         NSString *homePath = NSHomeDirectory();  
  11.         //在沙盒目录中创建一个文件file.text  
  12.         NSString *filePath = [homePath stringByAppendingPathComponent:@"Documents/file.text"];  
  13.         //NSFileManager是单利模式,所以不能使用alloc+init创建  
  14.         NSFileManager *manager = [NSFileManager defaultManager];  
  15.         NSString *str = @"无线互联";  
  16.         NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];  
  17.         //参数:文件路径、文件内容、文件的属性  
  18.         BOOL sucess = [manager createFileAtPath:filePath contents:data attributes:nil];  
  19.         if(sucess){  
  20.             NSLog(@"文件创建成功");  
  21.         }else{  
  22.             NSLog(@"文件创建失败");  
  23.         }  
  24.           
  25.         //创建文件夹  
  26.         NSString *filePaths = [homePath stringByAppendingPathComponent:@"Documents/file"];  
  27.         NSError *error;  
  28.         //需要传递一个创建失败的指针对象,记录创建失败的信息  
  29.         BOOL success1 = [manager createDirectoryAtPath:filePaths withIntermediateDirectories:YES attributes:nil error:&error];  
  30.         if(!success1){  
  31.             NSLog(@"创建成功");  
  32.         }else{  
  33.             NSLog(@"创建失败");  
  34.         }  
  35.           
  36.           
  37.         //--------------------读取文件  
  38.         //根据路径读取文件内容  
  39.         NSData *datas = [manager contentsAtPath:filePath];  
  40.         NSString *s = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];  
  41.         NSLog(@"%@",s);  
  42.           
  43.           
  44.         //--------------------移动文件/剪切文件  
  45.         //NSFileManager中没有提供重命名的方法,所以我们可以借助移动的api进行操作  
  46.         //把filePath移动到targetPath目录中  
  47.         NSString *targetPath = [homePath stringByAppendingPathComponent:@"Documents/file/file2.text"];  
  48.         BOOL sucess2 = [manager moveItemAtPath:filePath toPath:targetPath error:nil];  
  49.         if(sucess2) {  
  50.             NSLog(@"移动成功");  
  51.         }else{  
  52.             NSLog(@"移动失败");  
  53.         }  
  54.           
  55.           
  56.         //--------------------复制文件  
  57.         BOOL sucess3 = [manager copyItemAtPath:filePath toPath:targetPath error:nil];  
  58.         if(sucess3){  
  59.             //复制成功  
  60.         }else{  
  61.             //复制失败  
  62.         }  
  63.           
  64.           
  65.         //--------------------删除文件  
  66.         //删除之前需要判断这个文件是否存在  
  67.         BOOL isExist = [manager fileExistsAtPath:filePath];//判断文件是否存在  
  68.         if(isExist){  
  69.             BOOL sucess4 = [manager removeItemAtPath:filePath error:nil];  
  70.             if(sucess4){  
  71.                 //删除成功  
  72.             }else{  
  73.                 //删除失败  
  74.             }  
  75.         }  
  76.           
  77.           
  78.         //--------------------获取文件的属性  
  79.         NSDictionary *dic = [manager attributesOfItemAtPath:filePath error:nil];  
  80.         NSLog(@"%@",dic);//通过打印我们就可以查看文件属性的一些key  
  81.           
  82.         return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));  
  83.     }  
  84. }  
1、创建文件

[objc]  view plain copy
  1. //------------------创建文件/文件夹  
  2. //获取沙盒目录  
  3. NSString *homePath = NSHomeDirectory();  
  4. //在沙盒目录中创建一个文件file.text  
  5. NSString *filePath = [homePath stringByAppendingPathComponent:@"Documents/file.text"];  
  6. //NSFileManager是单利模式,所以不能使用alloc+init创建  
  7. NSFileManager *manager = [NSFileManager defaultManager];  
  8. NSString *str = @"无线互联";  
  9. NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];  
  10. //参数:文件路径、文件内容、文件的属性  
  11. BOOL sucess = [manager createFileAtPath:filePath contents:data attributes:nil];  
  12. if(sucess){  
  13.     NSLog(@"文件创建成功");  
  14. }else{  
  15.     NSLog(@"文件创建失败");  
  16. }  

NSFileManager内部使用了单例模式,这个后面会说到OC中得单例模式,然后就是构建一个NSData类,最后使用createFileAtPath方法创建文件,不过最后的attributes参数一般是用来给这个文件定义一些属性的,当然文件本身也是有很多默认的属性,比如文件的大小,文件的创建日期等,我们也可以自己在追加一些属性。


2、创建文件夹

[java]  view plain copy
  1. //创建文件夹  
  2. NSString *filePaths = [homePath stringByAppendingPathComponent:@"Documents/file"];  
  3. NSError *error;  
  4. //需要传递一个创建失败的指针对象,记录创建失败的信息  
  5. BOOL success1 = [manager createDirectoryAtPath:filePaths withIntermediateDirectories:YES attributes:nil error:&error];  
  6. if(!success1){  
  7.     NSLog(@"创建成功");  
  8. }else{  
  9.     NSLog(@"创建失败");  
  10. }  
从这两个操作看出来,他和Java中的File类很相似的


3、读取文件

[java]  view plain copy
  1. //--------------------读取文件  
  2. //根据路径读取文件内容  
  3. NSData *datas = [manager contentsAtPath:filePath];  
  4. NSString *s = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];  
  5. NSLog(@"%@",s);  


4、剪切文件

[objc]  view plain copy
  1. //--------------------移动文件/剪切文件  
  2. //NSFileManager中没有提供重命名的方法,所以我们可以借助移动的api进行操作  
  3. //把filePath移动到targetPath目录中  
  4. NSString *targetPath = [homePath stringByAppendingPathComponent:@"Documents/file/file2.text"];  
  5. BOOL sucess2 = [manager moveItemAtPath:filePath toPath:targetPath error:nil];  
  6. if(sucess2) {  
  7.     NSLog(@"移动成功");  
  8. }else{  
  9.     NSLog(@"移动失败");  
  10. }  
这里有两个参数:一个是需要移动文件的路径,和需要移动到哪的路径


5、复制文件

[objc]  view plain copy
  1. //--------------------复制文件  
  2. BOOL sucess3 = [manager copyItemAtPath:filePath toPath:targetPath error:nil];  
  3. if(sucess3){  
  4.     //复制成功  
  5. }else{  
  6.     //复制失败  
  7. }  

6、删除文件

[objc]  view plain copy
  1. //--------------------删除文件  
  2. //删除之前需要判断这个文件是否存在  
  3. BOOL isExist = [manager fileExistsAtPath:filePath];//判断文件是否存在  
  4. if(isExist){  
  5.     BOOL sucess4 = [manager removeItemAtPath:filePath error:nil];  
  6.     if(sucess4){  
  7.         //删除成功  
  8.     }else{  
  9.         //删除失败  
  10.     }  
  11. }  

7、操作文件的属性
[objc]  view plain copy
  1. //--------------------获取文件的属性  
  2. NSDictionary *dic = [manager attributesOfItemAtPath:filePath error:nil];  
  3. NSLog(@"%@",dic);//通过打印我们就可以查看文件属性的一些key  
属性一般是NSDictionary


二、NSFileHandle

这个类主要是对文件进行读写操作的

看代码:

[objc]  view plain copy
  1. //  
  2. //  main.m  
  3. //  40_NSFileHandle  
  4. //  
  5. //  Created by jiangwei on 14-10-13.  
  6. //  Copyright (c) 2014年 jiangwei. All rights reserved.  
  7. //  
  8.   
  9. #import <UIKit/UIKit.h>  
  10. #import "AppDelegate.h"  
  11.   
  12. //写文件,我们之前使用各种数据结构来存储数据:NSString,NSData,NSDictionary,NSArray等,他们都是有一个writeToFile方法用来写文件的  
  13.   
  14. //纯文本:没有任何格式的数据  
  15. //非纯文本:有修饰的数据(字体大小,字体颜色等)  
  16.   
  17. //数组只能将如下类型写入文件,如果包含其他对象,将写入失败:NSNumber,NSString,NSData,NSDate,NSArray,NSDictionary  
  18. //数组、字典写入的文件叫做属性文件,可以使用xcode进行编辑  
  19. int main(int argc, charchar * argv[]) {  
  20.     @autoreleasepool {  
  21.           
  22.         //1.-------------------字符串读写文件  
  23.         NSString *str = @"无线互联";  
  24.         NSString *homePath = NSHomeDirectory();  
  25.         NSString *filePath = [homePath stringByAppendingPathComponent:@"Documents/file.text"];  
  26.         //现在有这样的场景,第一次把字符串写入到文件中,当我们修改字符串之后,再次写入的时候,但是可能会写入失败  
  27.         //但是之前的内容也有可能丢失,因为每次在写入新的内容的时候,会剪切之前的内容,所以这里就有可能新的没有写  
  28.         //成功,旧的文件也丢失了  
  29.         //所以这时候atomically参数:  
  30.         //YES:会将新内容先写入到一个缓存文件中,如果写入缓存成功之后,这时候就将这个缓存文件替换旧文件,这样就很安全了  
  31.         BOOL sucess = [str writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:nil];  
  32.         if(sucess){  
  33.             //写入成功  
  34.         }else{  
  35.             //写入失败  
  36.         }  
  37.         //读取文件内容到字符串中  
  38.         //类方法  
  39.         NSString *str1 = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];  
  40.         //构造方法  
  41.         //str1 = [[NSString alloc] initWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];  
  42.         NSLog(@"%@",str1);  
  43.           
  44.           
  45.         //2.--------------------NSData读写  
  46.         //创建NSData的同时读取文件中的内容  
  47.         NSData *data = [[NSData alloc] initWithContentsOfFile:filePath];  
  48.         //NSData转化成NSString  
  49.         NSString *s = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];  
  50.         NSLog(@"%@",s);  
  51.           
  52.         //写文件  
  53.         BOOL sucess1 = [data writeToFile:filePath atomically:YES];  
  54.         if(sucess1){  
  55.             //写入成功  
  56.         }else{  
  57.             //写入失败  
  58.         }  
  59.           
  60.           
  61.         //3.--------------------NSArray读写文件  
  62.         NSArray *array = @[@"zhangsan",@"lisi"];  
  63.         //属性文件一般后缀名为.plist  
  64.         NSString *filePaths = [homePath stringByAppendingPathComponent:@"Documents/array.plist"];  
  65.         BOOL sucess2 = [array writeToFile:filePaths atomically:YES];  
  66.         if(sucess2){  
  67.             //写入成功  
  68.         }else{  
  69.             //写入失败  
  70.         }  
  71.         //读文件  
  72.         NSArray *arrays = [[NSArray alloc] initWithContentsOfFile:filePath];  
  73.         NSLog(@"%@",arrays);  
  74.           
  75.           
  76.         //4.---------------------NSDictionary读写文件  
  77.         NSDictionary *dic = @{@"zhang":@"zhangsan",@"li":@"lisi"};  
  78.         BOOL sucess3 = [dic writeToFile:filePath atomically:YES];  
  79.         if(sucess3){  
  80.             //写入成功  
  81.         }else{  
  82.             //写入失败  
  83.         }  
  84.           
  85.         //读文件  
  86.         dic = [[NSDictionary alloc] initWithContentsOfFile:filePath];  
  87.         NSLog(@"%@",dic);  
  88.           
  89.           
  90.         return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));  
  91.     }  
  92. }  
这个类就和Java中的FileInputStream/FileOutputStream类似了

其实我们在之前看到归档和解档操作的时候,那就是相当于写文件和读文件操作了。


1、字符串直接写入文件

[objc]  view plain copy
  1. //1.-------------------字符串读写文件  
  2. NSString *str = @"无线互联";  
  3. NSString *homePath = NSHomeDirectory();  
  4. NSString *filePath = [homePath stringByAppendingPathComponent:@"Documents/file.text"];  
  5. //现在有这样的场景,第一次把字符串写入到文件中,当我们修改字符串之后,再次写入的时候,但是可能会写入失败  
  6. //但是之前的内容也有可能丢失,因为每次在写入新的内容的时候,会剪切之前的内容,所以这里就有可能新的没有写  
  7. //成功,旧的文件也丢失了  
  8. //所以这时候atomically参数:  
  9. //YES:会将新内容先写入到一个缓存文件中,如果写入缓存成功之后,这时候就将这个缓存文件替换旧文件,这样就很安全了  
  10. BOOL sucess = [str writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:nil];  
  11. if(sucess){  
  12.     //写入成功  
  13. }else{  
  14.     //写入失败  
  15. }  
  16. //读取文件内容到字符串中  
  17. //类方法  
  18. NSString *str1 = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];  
  19. //构造方法  
  20. //str1 = [[NSString alloc] initWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];  
  21. NSLog(@"%@",str1);  
我们使用拼接的方式创建Documents目录中的file.text文件,然后将字符串内容写入到其中。

writeToFile方法进行写入

其实OC中的各种数据结构都有这个方法的:NSString,NSData,NSArray,NSSet,NSDirctionary等

这里有两点要注意的:

1)

数组只能将如下类型写入文件,如果包含其他对象,将写入失败:NSNumber,NSString,NSData,NSDate,NSArray,NSDictionary

数组、字典写入的文件叫做属性文件,可以使用xcode进行编辑


这个就是系统提供的一个属性文件:info.plist

这个和Java中的Property文件很类似


2)writeToFile方法的第一个参数:automically

现在有这样的场景,第一次把字符串写入到文件中,当我们修改字符串之后,再次写入的时候,但是可能会写入失败但是之前的内容也有可能丢失,因为每次在写入新的内容的时候,会剪切之前的内容,所以这里就有可能新的没有写成功,旧的文件也丢失了所以这时候atomically参数:YES:会将新内容先写入到一个缓存文件中,如果写入缓存成功之后,这时候就将这个缓存文件替换旧文件,这样就很安全了


2、NSData的内容读写

[objc]  view plain copy
  1. //2.--------------------NSData读写  
  2. //创建NSData的同时读取文件中的内容  
  3. NSData *data = [[NSData alloc] initWithContentsOfFile:filePath];  
  4. //NSData转化成NSString  
  5. NSString *s = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];  
  6. NSLog(@"%@",s);  
  7.   
  8. //写文件  
  9. BOOL sucess1 = [data writeToFile:filePath atomically:YES];  
  10. if(sucess1){  
  11.     //写入成功  
  12. }else{  
  13.     //写入失败  
  14. }  


3、NSArray的内容读写

[objc]  view plain copy
  1. //3.--------------------NSArray读写文件  
  2. NSArray *array = @[@"zhangsan",@"lisi"];  
  3. //属性文件一般后缀名为.plist  
  4. NSString *filePaths = [homePath stringByAppendingPathComponent:@"Documents/array.plist"];  
  5. BOOL sucess2 = [array writeToFile:filePaths atomically:YES];  
  6. if(sucess2){  
  7.     //写入成功  
  8. }else{  
  9.     //写入失败  
  10. }  
  11. //读文件  
  12. NSArray *arrays = [[NSArray alloc] initWithContentsOfFile:filePath];  
  13. NSLog(@"%@",arrays);  


4、NSDirctionary的内容读写

[objc]  view plain copy
  1. //4.---------------------NSDictionary读写文件  
  2. NSDictionary *dic = @{@"zhang":@"zhangsan",@"li":@"lisi"};  
  3. BOOL sucess3 = [dic writeToFile:filePath atomically:YES];  
  4. if(sucess3){  
  5.     //写入成功  
  6. }else{  
  7.     //写入失败  
  8. }  
  9.   
  10. //读文件  
  11. dic = [[NSDictionary alloc] initWithContentsOfFile:filePath];  
  12. NSLog(@"%@",dic);  
上面说到的系统的info.plist文件就是NSDirctionary

三、在来看一下NSFileHandle的其他用法

[objc]  view plain copy
  1. //  
  2. //  main.m  
  3. //  41_NSFileHandleTest  
  4. //  
  5. //  Created by jiangwei on 14-10-14.  
  6. //  Copyright (c) 2014年 jiangwei. All rights reserved.  
  7. //  
  8.   
  9. #import <UIKit/UIKit.h>  
  10. #import "AppDelegate.h"  
  11.   
  12. //NSFileHandle是对文件内容进行读写  
  13. int main(int argc, charchar * argv[]) {  
  14.     @autoreleasepool {  
  15.           
  16.         //追加数据  
  17.         NSString *str = @"无线互联";  
  18.         NSString *homePath = NSHomeDirectory();  
  19.         NSString *filePath = [homePath stringByAppendingPathComponent:@"file.test"];  
  20.         [str writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:nil];//写入文件  
  21.           
  22.         NSFileHandle *handle = [NSFileHandle fileHandleForWritingAtPath:filePath];  
  23.         //默认是从开始位置写,所以我们需要将写入游标设置到尾部  
  24.         //从文件的末尾写入  
  25.         [handle seekToEndOfFile];  
  26.         NSString *s = @"123";  
  27.         NSData *data = [s dataUsingEncoding:NSUTF8StringEncoding];  
  28.         [handle writeData:data];  
  29.         //关闭文件  
  30.         [handle closeFile];  
  31.           
  32.           
  33.         //读取文件  
  34.         NSFileHandle *handles = [NSFileHandle fileHandleForReadingAtPath:filePath];  
  35.           
  36.         //获取文件的大小  
  37.         NSFileManager *fileManager = [NSFileManager defaultManager];  
  38.         NSDictionary *fileAttr = [fileManager attributesOfItemAtPath:filePath error:nil];  
  39.         NSNumber *fileSize = [fileAttr objectForKey:NSFileSize];  
  40.         long long sizeValue = [fileSize longLongValue];  
  41.           
  42.         //设置偏移量  
  43.         [handle seekToFileOffset:sizeValue/2];//将偏移量设置到中间位置  
  44.         //从当前偏移量读到文件末尾  
  45.         NSData *datas = [handle readDataToEndOfFile];  
  46.         NSString *s2 = [[NSString alloc] initWithData:datas encoding:NSUTF8StringEncoding];  
  47.         NSLog(@"%@",s2);  
  48.           
  49.         //一个汉字占用两个字节,有时候可能会将一个汉字分成两半,有乱码的问题,需要注意  
  50.           
  51.           
  52.         //实现复制文件的功能  
  53.         //使用NSFileHandle只能读写已经存在的文件,不能创建文件,创建文件应该使用NSFileManager  
  54.         NSString *targetPath = [homePath stringByAppendingPathComponent:@"files.test"];  
  55.         NSFileManager *fileManagers = [NSFileManager defaultManager];  
  56.         [fileManagers createFileAtPath:targetPath contents:nil attributes:nil];  
  57.           
  58.         //创建读取文件的handle  
  59.         NSFileHandle *readHandles = [NSFileHandle fileHandleForReadingAtPath:filePath];  
  60.         //创建写文件的handle  
  61.         NSFileHandle *writeHandles = [NSFileHandle fileHandleForWritingAtPath:targetPath];  
  62.           
  63.         //从当前偏移量读取到文件的末尾  
  64.         NSData *datass = [readHandles readDataToEndOfFile];  
  65.         //还有一种方式读取文件,既可以读取文件,也可以读流,功能更强  
  66.         //[readHandles availableData];  
  67.         [writeHandles writeData:datass];  
  68.           
  69.         //关闭文件  
  70.         [readHandles closeFile];  
  71.         [writeHandles closeFile];  
  72.           
  73.         //这里有问题,就是读取文件的时候全部读取了,这样会很占内存的,所以我们应该将读取内容进行分段  
  74.           
  75.           
  76.           
  77.                                  
  78.         return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));  
  79.     }  
  80. }  


1、对原有的内容进行追加操作

[objc]  view plain copy
  1. //追加数据  
  2. NSString *str = @"无线互联";  
  3. NSString *homePath = NSHomeDirectory();  
  4. NSString *filePath = [homePath stringByAppendingPathComponent:@"file.test"];  
  5. [str writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:nil];//写入文件  
  6.   
  7. NSFileHandle *handle = [NSFileHandle fileHandleForWritingAtPath:filePath];  
  8. //默认是从开始位置写,所以我们需要将写入游标设置到尾部  
  9. //从文件的末尾写入  
  10. [handle seekToEndOfFile];  
  11. NSString *s = @"123";  
  12. NSData *data = [s dataUsingEncoding:NSUTF8StringEncoding];  
  13. [handle writeData:data];  
  14. //关闭文件  
  15. [handle closeFile];  
记得操作完之后,关闭文件,我们在追加文件的时候,只要在将当前游标移动到文件的末尾处即可,默认是在开始处


2、读取文件的任何位置内容

[objc]  view plain copy
  1. //读取文件  
  2. NSFileHandle *handles = [NSFileHandle fileHandleForReadingAtPath:filePath];  
  3.   
  4. //获取文件的大小  
  5. NSFileManager *fileManager = [NSFileManager defaultManager];  
  6. NSDictionary *fileAttr = [fileManager attributesOfItemAtPath:filePath error:nil];  
  7. NSNumber *fileSize = [fileAttr objectForKey:NSFileSize];  
  8. long long sizeValue = [fileSize longLongValue];  
  9.   
  10. //设置偏移量  
  11. [handle seekToFileOffset:sizeValue/2];//将偏移量设置到中间位置  
  12. //从当前偏移量读到文件末尾  
  13. NSData *datas = [handle readDataToEndOfFile];  
  14. NSString *s2 = [[NSString alloc] initWithData:datas encoding:NSUTF8StringEncoding];  
  15. NSLog(@"%@",s2);  
还是设置一下游标的位置即可


3、实现文件的复制功能

[objc]  view plain copy
  1. //实现复制文件的功能  
  2. //使用NSFileHandle只能读写已经存在的文件,不能创建文件,创建文件应该使用NSFileManager  
  3. NSString *targetPath = [homePath stringByAppendingPathComponent:@"files.test"];  
  4. NSFileManager *fileManagers = [NSFileManager defaultManager];  
  5. [fileManagers createFileAtPath:targetPath contents:nil attributes:nil];  
  6.   
  7. //创建读取文件的handle  
  8. NSFileHandle *readHandles = [NSFileHandle fileHandleForReadingAtPath:filePath];  
  9. //创建写文件的handle  
  10. NSFileHandle *writeHandles = [NSFileHandle fileHandleForWritingAtPath:targetPath];  
  11.   
  12. //从当前偏移量读取到文件的末尾  
  13. NSData *datass = [readHandles readDataToEndOfFile];  
  14. //还有一种方式读取文件,既可以读取文件,也可以读流,功能更强  
  15. //[readHandles availableData];  
  16. [writeHandles writeData:datass];  
  17.   
  18. //关闭文件  
  19. [readHandles closeFile];  
  20. [writeHandles closeFile];  
  21.   
  22. //这里有问题,就是读取文件的时候全部读取了,这样会很占内存的,所以我们应该将读取内容进行分段  

你可能感兴趣的:(程序沙盒目录,下面继续来看一下操作文件的两个类)