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];
}
网友评论