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应用的文件目录有Documents
,tmp
,Library
, Library
中又包含了Caches
和Preferences
。
程序的缓存文件存放于沙盒中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