8.iOS应用的文件目录

Q:iOS应用的文件目录都有哪些?缓存文件放在哪个文件里?

1. 目录结构

沙盒目录

从图中我们可以看到一个应用程序沙盒目录中的文件夹有这么几个:

  • Documents:这个目录用于存储用户数据。该路径可通过配置实现iTunes共享文件。可被 iTunes 同步。
  • Library:该目录下有两个子目录:
    1.Preferences:包含应用程序的偏好设置文件。通过NSUserDefaults这个类来写入,而不是直接创建偏好设置文件。
    2.Caches:用于存放应用程序专用的支持文件,保存应用程序再次启动过程中需要的信息。
    Library目录中,可以创建子文件夹,可以用来存放不希望被用户看到的备份数据。在该路径下的文件夹,除了Caches外,都会被 iTunes 同步。
  • tmp:用来存放应用再次启动时不需要的临时文件,该目录下的东西随时可能被系统清理掉,不会被 iTunes 同步。

2. 获取文件目录路径的方法

// 获取沙盒主目录路径
NSString *homeDir = NSHomeDirectory();
// 获取Documents目录路径
NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
// 获取Library的目录路径
NSString *libDir = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject];
// 获取Caches目录路径
NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
// 获取tmp目录路径
NSString *tmpDir =  NSTemporaryDirectory();

总结

iOS应用的文件目录有DocumentstmpLibraryLibrary中又包含了CachesPreferences
程序的缓存文件存放于沙盒中Library中的Caches目录中。

PS:iOS文件操作

  • 使用NSSearchPathForDirectoriesInDomains创建文件目录
- (void)create{  
    // 使用NSSearchPathForDirectoriesInDomains只能定位Caches、Library、Documents目录,tmp目录不能按照此方法获得  
    NSString * docsdir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];  
    NSString *dataFilePath = [docsdir stringByAppendingPathComponent:@"head"]; // 在指定目录下创建 "head" 文件夹  
    NSFileManager *fileManager = [NSFileManager defaultManager];  
    BOOL isDir = NO;  
    // fileExistsAtPath 判断一个文件或目录是否有效,isDirectory判断是否一个目录  
    BOOL existed = [fileManager fileExistsAtPath:dataFilePath isDirectory:&isDir];  
      
    if ( !(isDir == YES && existed == YES) ) {  
        // 在 Document 目录下创建一个 head 目录  
        [fileManager createDirectoryAtPath:dataFilePath withIntermediateDirectories:YES attributes:nil error:nil];  
    }  
}  
  • 使用 NSHomeDirectory() 创建文件目录
- (void)create{  
    // NSHomeDirectory():应用程序目录, @"tmp/temp":在tmp文件夹下创建temp 文件夹  
    NSString *filePath=[NSHomeDirectory() stringByAppendingPathComponent:@"tmp/temp"];  
    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    BOOL isDir = NO;  
      
    // fileExistsAtPath 判断一个文件或目录是否有效,isDirectory判断是否一个目录  
    BOOL existed = [fileManager fileExistsAtPath:filePath isDirectory:&isDir];  
      
    if ( !(isDir == YES && existed == YES) ) {  
        // 在 tmp 目录下创建一个 temp 目录  
        [fileManager createDirectoryAtPath:filePath withIntermediateDirectories:YES attributes:nil error:nil];  
    }  
}  
  • 其他常用操作
// filePath: 文件/目录的路径
- (void)otherFileManager:(NSString *) filePath {   
    NSFileManager *fileManager = [NSFileManager defaultManager]; 
 
    // 取得一个目录下得所有文件名  
    NSArray *files = [fileManager subpathsAtPath:filePath];  
      
    // 读取某个文件  
    NSData *data = [fileManager contentsAtPath:filePath];  
      
    // 删除文件/文件夹  
    [fileManager removeItemAtPath:filePath error:nil];  
}  

参考资料链接:
https://www.cnblogs.com/wujy/archive/2016/02/13/5188302.html

你可能感兴趣的:(8.iOS应用的文件目录)