iPhone文件操作(资料+总结)
首先我们先了解一下iPhone应用程序中App目录结构,如下:
对于一个运行在iPhone的app,它只能访问自己根目录下得一些文件(所谓sandbox).
一个app发布到iPhone上后,它得目录结构如下:
1、其中的app root可以用 NSHomeDirectory()访问到;
例如:NSString *documentsDirectory= NSHomeDirectory();
2、Documents目录就是我们可以用来写入并保存文件得地方,一般可通过:
1.NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
2.NSString *documentsDirectory = [paths objectAtIndex:0];
也可用
NSString *documentsDirectory= [NSHomeDirectory()stringByAppendingPathComponent:@"Documents"];
3、tmp目录我们可以在里面写入一些程序运行时需要用的数据,里面写入的数据在程序退出后会没有。
可以通过:
NSString *NSTemporaryDirectory(void);方法得到
4、文件操作可以通过NSFileManage 来操作,可以通过 [NSFileManger defaultManger] 得到它例。 相关得一些操作:
创建一个目录:比如要在Documents下面创建一个test目录:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];//获得路径,常用的
NSLog(@"%@",documentsDirectory);
NSFileManager *fileManage = [NSFileManagerdefaultManager];
NSString *myDirectory = [documentsDirectory stringByAppendingPathComponent:@"test"];
BOOL ok = [fileManage createDirectoryAtPath:myDirectory attributes:nil];
(小插曲)
- (BOOL)createDirectoryAtPath:(NSString *)path attributes:(NSDictionary *)attributes;
会出现'createDirectoryAtPath:attributes:' is deprecated警告
这个意思是说在以后的版本中这个API有可能被抛弃,所以苹果不赞成你使用这个API,一般会有另一个API取代它!故在 Leopard之就
不赞成使用了取而代之的是:
- (BOOL)createDirectoryAtPath:(NSString *)path withIntermediateDirectories:(BOOL)createIntermediates
attributes:(NSDictionary *)attributes error:(NSError **)error;
取得一个目录下得所有文件名:
NSFileManager *fileManage = [NSFileManagerdefaultManager]; //指向文件目录
NSString *myDirectory= [NSHomeDirectory() stringByAppendingPathComponent:@"test"];
NSLog(@"%@",myDirectory);
NSArray *file = [fileManage subpathsOfDirectoryAtPath: myDirectory error:nil];
NSLog(@"%目录下得所有文件名%@",file);
//或者
NSArray *files = [fileManage subpathsAtPath: myDirectory ];
NSLog(@"%目录下得所有文件名%@",files);
创建文件(接上面,创建在自己的目录下的)
//创建文件管理器
NSFileManager *fileManager = [NSFileManagerdefaultManager];
NSString *documentsDirectory= [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/test"];
//更改到待操作的目录下
[fileManager changeCurrentDirectoryPath:[documentsDirectory stringByExpandingTildeInPath]];
//创建文件fileName文件名称,contents文件的内容,如果开始没有内容可以设置为nil,attributes文件的属性,初始为nil
[fileManagercreateFileAtPath:@"fileName"contents:nilattributes:nil];
创建文件(创建在Documents目录下的)
//创建文件管理器
NSFileManager *fileManager = [NSFileManagerdefaultManager];
//获取路径//参数NSDocumentDirectory要获取那种路径
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];//去处需要的路径
//更改到待操作的目录下
[fileManagerchangeCurrentDirectoryPath:[documentsDirectory stringByExpandingTildeInPath]];
//创建文件fileName文件名称,contents文件的内容,如果开始没有内容可以设置为nil,attributes文件的属性,初始为nil
[fileManagercreateFileAtPath:@"tongtong"contents:nilattributes:nil];
4、写入文件
写入基本数据
NSFileManager *fileMgr = [NSFileManagerdefaultManager]; //指向文件目录
NSString *documentsDirectory= [NSHomeDirector()stringByAppendingPathComponent:@"Documents/test"];//创建文件管理器
NSLog(@"目录文件保存位置%@",documentsDirectory);
//获得我们需要的文体的位置
NSString *filePath= [documentsDirectory stringByAppendingPathComponent:@"file1.txt"];
//需要写入的字符串
NSString *str= @"iPhoneDeveloper Tips\nhttp://iPhoneDevelopTips,com";
//写入文件
[str writeToFile:filePath atomically:YES encoding:NSUTF8StringEncodingerror:nil];
//显示文件目录的内容
NSLog(@"Documentsdirectory: %@", [fileMgrcontentsOfDirectoryAtPath:documentsDirectory error:nil]);
写入数据:
NSString *documentsDirectory= [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/test"];
NSLog(@"%@",documentsDirectory);
NSString *path= [documentsDirectory stringByAppendingPathComponent:@"file1.txt"];
//待写入的数据
NSString *temp = @"Hello friend";
int data0 = 100000;
float data1 = 23.45f;
//创建数据缓冲
NSMutableData *writer = [[NSMutableDataalloc] init];
//将字符串添加到缓冲中
[writer appendData:[tempdataUsingEncoding:NSUTF8StringEncoding]];
//将其他数据添加到缓冲中
[writer appendBytes:&data0 length:sizeof(data0)];
[writer appendBytes:&data1 length:sizeof(data1)];
//将缓冲的数据写入到文件中
[writer writeToFile:path atomically:YES];
[writer release];
5、读取文件
读取数据(接上面):
NSString *documentsDirectory= [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/test"];
NSLog(@"%@",documentsDirectory);
NSString *path= [documentsDirectory stringByAppendingPathComponent:@"file1.txt"];
//待写入的数据
NSString *temp = @"Hello friend";
int gData0;
float gData1;
NSString *gData2;
NSData *reader = [NSDatadataWithContentsOfFile:path];
gData2 = [[NSStringalloc] initWithData:[reader subdataWithRange:NSMakeRange(0, [temp length])]
encoding:NSUTF8StringEncoding];
[reader getBytes:&gData0 range:NSMakeRange([templength], sizeof(gData0))];
[reader getBytes:&gData1 range:NSMakeRange([templength] + sizeof(gData0), sizeof(gData1))];
NSLog(@"gData0:%d gData1:%f gData2:%@", gData0, gData1, gData2);
6、删除文件
//在filePath中判断是否删除这个文件
if ([fileMgr removeItemAtPath:filePath error:&error] != YES)
NSLog(@"Unable to delete file: %@", [error localizedDescription]);
//显示文件目录的内容
NSLog(@"Documentsdirectory: %@", [fileMgrcontentsOfDirectoryAtPath:documentsDirectory error:&error]);