每个ios应用程序运行在自己的沙盒里,使用模拟器时,每次程序启动的位置可能显示这样的:
/Users/xiechangjie/Library/Developer/CoreSimulator/Devices/4AF2B6F4-942E-4A8A-9385-4F7DE438F06A/data/Containers/Data/Application/EF178531-EA1D-4B6C-B1DD-BA6A98BAC41F/Documents
Application目录下的一串字符每次是变动的。
要获取Documents目录,使用:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDir = [paths objectAtIndex:0];
获取Documents上一级: //通常它包含Documents tmp Library三个子目录,通常程序也只能写这三个子目录。
NSString *destPath = NSHomeDirectory();
NSLog(@"path: %@",destPath);
获取tmp目录
NSString *fileName=[NSHomeDirectory() stringByAppendingPathComponent:@"tmp/myFile.txt"];
或
NSTemporaryDirectory()
三个目录使用区别:
- Documents:应用中用户数据可以放在这里,iTunes备份和恢复的时候会包括此目录(常量是NSDocumentDirectory)
- tmp:存放临时文件,iTunes不会备份和恢复此目录,此目录下文件可能会在应用退出后删除
- Library/Caches:存放缓存文件,iTunes不会备份此目录,此目录下文件不会在应用退出删除(常量是NSCachesDirectory)
在Documents下创建文件:
NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory
, NSUserDomainMask
, YES);
NSLog(@"Get document path: %@",[paths objectAtIndex:0]);
NSString *fileName=[[paths objectAtIndex:0] stringByAppendingPathComponent:@"myFile"];
NSString *content=@"a";
NSData *contentData=[content dataUsingEncoding:NSASCIIStringEncoding];
if ([contentData writeToFile:fileName atomically:YES]) {
NSLog(@">>write ok.");
}
带编码的文件:
NSString *fileName=[[paths objectAtIndex:0] stringByAppendingPathComponent:@"myFile"];
NSString *content=@"你好";
NSData *contentData=[content dataUsingEncoding:NSUnicodeStringEncoding];
if ([contentData writeToFile:fileName atomically:YES]) {
NSLog(@">>write ok.");
}
读取文件:
NSString *myFilePath = [[NSBundle mainBundle] pathForResource:@"readme" ofType:@"txt"];
NSString *myFileContent=[NSString stringWithContentsOfFile:myFilePath encoding:NSUTF8StringEncoding error:nil];
NSLog(@"bundel file path: %@ \nfile content:%@",myFilePath,myFileContent);