PathUtility

 

因为应用是在沙箱(sandbox)中的,在文件读写权限上受到限制,只能在几个目录下读写文件:

  • Documents:应用中用户数据可以放在这里,iTunes备份和恢复的时候会包括此目录

  • tmp:存放临时文件,iTunes不会备份和恢复此目录,此目录下文件可能会在应用退出后删除

  • Library/Caches:存放缓存文件,iTunes不会备份此目录,此目录下文件不会在应用退出删除

Doucments目录下创建文件 

  1.     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask , YES);  
  2.     NSString *fileName = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"myFile"]; //获取Documents目录路径 
  3.     NSString *content=@"a";  
  4.     NSData *contentData=[content dataUsingEncoding:NSASCIIStringEncoding];  
  5.     if ([contentData writeToFile:fileName atomically:YES]) { //data类型数据写入到fileName文件中 
  6.     NSLog(@">>write ok.");  

 

如果写入数据是带有汉字的

  1. NSString *fileName=[[paths objectAtIndex:0] stringByAppendingPathComponent:@"myFile"];  
  2. NSString *content=@"更深夜静人已息";  
  3. NSData *contentData=[content dataUsingEncoding:NSUnicodeStringEncoding];  
  4. [contentData writeToFile:fileName atomically:YES]) {  
  5. NSLog(@">>write ok.");  

 

在其他目录下创建文件

如果要指定其他文件目录,比如Caches目录,需要更换目录工厂常量,上面代码其他的可不变

  1. NSArray *paths=NSSearchPathForDirectoriesInDomains(NSCachesDirectory , NSUserDomainMask , YES); 

 

使用NSSearchPathForDirectoriesInDomains只能定位Caches目录和Documents目录。tmp目录,不能按照上面的做法获得目录了,有个函数可以获得应用的根目录:也就是Documents的上级目录,当然也是tmp目录的上级目录。那么文件路径可以这样写:NSHomeDirectory()NSTemporaryDirectory()

  1. NSString *fileName=[NSHomeDirectory() stringByAppendingPathComponent:@"tmp/myFile.txt"]; 
  2. NSString *fileName=[NSTemporaryDirectory() stringByAppendingPathComponent:@"tmp/myFile.txt"]; 

 

使用资源文件

在编写应用项目的时候,常常会使用资源文件,比如:

  1. NSString *path = [[NSBundle mainBundle] pathForResource:@”demo” ofType:@”plist”]; 
  2. NSMutableDictionary *data = [[NSMutableDictionary alloc] initWithContentsOfFile:path]; 


可以编辑一个PathUtility类继承NSObject,便于整个项目使用

  1. 1.获取应用程序沙盒的Documents目录路径 
  2. + (NSString *)documentPath { 
  3.     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
  4.     return [paths objectAtIndex:0]; 
  5.  
  6. 2.获取临时目录路径 
  7. + (NSString *)tempPath { 
  8.     return  NSTemporaryDirectory(); 
  9.  
  10. 3.获取文件目录路径 
  11. + (NSString *)documentFilePath:(NSString *)format,... { 
  12.     va_list args; 
  13.     va_start(args, format); 
  14.     NSString *str = [[[NSString alloc] initWithFormat:format arguments:args] autorelease]; 
  15.     va_end(args); 
  16.     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
  17.     NSString *documentsDirectory = [paths objectAtIndex:0]; 
  18. return [documentsDirectory stringByAppendingPathComponent:str]; 
  19.  
  20. 4.获取本地文件目录路径 
  21. + (NSString *)bundleFilePath:(NSString *)format,... { 
  22.     va_list args; 
  23.     va_start(args, format); 
  24.     NSString *str = [[[NSString alloc] initWithFormat:format arguments:args] autorelease]; 
  25.     va_end(args); 
  26.     return [[[NSBundle mainBundle] bundlePath] stringByAppendingFormat:@"/%@",str]; 

 

下面表格中的措施,可以用来操作路径:

措施名称 描述
+(NSString *)pathWithComponents:components 用components创建有效的路径名称
-(NSArray *)pathComponents 将路径名称拆分成若干组成部分
-(NSString *)lastPathComponent 获取路径名称中最后一个组成部分
-(NSString *)pathExtension 获取路径名称中的扩展名(后缀名)
-(NSString *)stringByAppendingPathComponent:path 将path添加到已有的路径名称末尾
-(NSString *)stringByAppendingPathExtension:ext 将扩展名ext添加到已有的路径名称的最后一个组成部分的末尾
-(NSString *)stringByDeletingLastPathComponent 将已有的路径名称的最后一个组成部分删除
-(NSString *)stringByDeletingPathExtension 删除已有路径名称的扩展名
-(NSString *)stringByExpandingTildeInPath 将路径名称中的~字符展开
-(NSString *)stringByResolvingSymlinksInPath 解析路径名称中的符号链接
-(NSString *)stringByStandardizingPath 将路径名称标准化

 

下面表格中的函数  可以用来获取  用户名、用户的主目录路径  还有  临时目录路径:

函数名称 描述
NSString *NSUserName(void) 获取当前用户的登录名
NSString *NSFullUserName(void) 获取当前用户的全名
NSString *NSHomeDirectory(void) 获取当前用户的主目录路径
NSString *NSHomeDirectoryForUser(NSString *user) 获取用户user的主目录路径
NSString *NSTemporaryDirectory(void) 获取临时目录的路径