一、简介
-
每个iOS应用都有自己的应用沙盒(应用沙盒就是文件系统目录),与其他文件系统隔离。
-
应用必须待在自己的沙盒里,其他应用不能访问该沙盒
-
二、应用沙盒目录
-
Application应用程序包:包含了所有的资源文件和和可执行文件,上架前经过数字签名,上架后不可修改
-
Documents:保存应用程序本身运行时产生的文件或者数据,iCloud备份目录,例如:游戏进度、涂鸦软件的绘图
-
注意点:不要保存从网络上下载的文件,否则会无法上架!
-
-
Library
-
用户偏好,使用 NSUserDefault 直接读写!
-
如果要想数据及时写入磁盘,还需要调用一个同步方法
-
保存临时文件,"后续需要使用",例如:缓存图片,离线数据(地图数据)
-
系统不会清理 cache 目录中的文件
-
就要求程序开发时,"必须提供 cache 目录的清理解决方案"
-
Caches:存放体积大又不需要备份的数据
-
Preference:保存应用的所有偏好设置,iCloud会备份设置信息
-
-
tmp:存放临时文件,不会被备份,而且这个文件下的数据有可能随时被清除的可能
-
保存临时文件,"后续不需要使用"
-
tmp 目录中的文件,系统会自动清理
-
重新启动手机,tmp 目录会被清空
-
系统磁盘空间不足时,系统也会自动清理
-
三、应用沙盒目录的常见获取方式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
// 沙盒根目录
NSString *homeDir = NSHomeDirectory();
NSLog(@ "homeDir: %@" , homeDir);
// 获取tmp目录
NSString *tmpDir = NSTemporaryDirectory();
NSLog(@ "tmpDir: %@" , tmpDir);
// NSUserDomainMask 代表从用户文件夹下找
// YES 代表展开路径中的波浪字符“~”
// 在iOS中,只有一个目录跟传入的参数匹配,所以这个集合里面只有一个元素NSString*documents =[array objectAtIndex:0];
NSString *documents = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, NO) objectAtIndex:0];
NSLog(@ "Documents: %@" , documents);
// 获取Documents目录
// NSSearchPathForDirectoriesInDomains(要查找的目录, 是否是用户主目录, YES/NO 是否获取全路径);
NSArray *arr1 = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSLog(@ "Documents: %@" , [arr1 lastObject]);
// 获取Library目录
NSArray *arr2 = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSLog(@ "Library: %@" , [arr2 lastObject]);
// 获取Library/Caches目录
NSArray *arr3 = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSLog(@ "Caches: %@" , [arr3 lastObject]);
// 获取Library/Preferences目录
NSArray *arr4 = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString *path = [arr4 lastObject];
path = [path stringByAppendingPathComponent:@ "Preferences" ];
NSLog(@ "Preferences: %@" , path);
// 写入文件到指定的文件夹下
NSString *path2 = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, NO) objectAtIndex:0];
path2 = [path2 stringByAppendingPathComponent:@ "Preferences/test.txt" ];
NSString *str = @ "Jacedy" ;
[str writeToFile:path2 atomically:YES encoding:NSUTF8StringEncoding error:nil];
// 创建目录
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *testDir = [path2 stringByAppendingPathComponent:@ "test" ];
[fileManager createDirectoryAtPath:testDir withIntermediateDirectories:YES attributes:nil error:nil];
if ([fileManager fileExistsAtPath:testDir]) {
NSLog(@ "It is exist" );
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
// 文件操作 - ( void )fileManage
{ NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
#pragma mark - NSString写入文件 NSString *txtPath = [docPath stringByAppendingPathComponent:@ "bada.txt" ]; // 此时仅存在路径,文件并没有真实存在
NSString *string = @ "莽荒记" ;
[string writeToFile:txtPath atomically:YES encoding:NSUTF8StringEncoding error:nil]; // 字符串写入时执行的代码
NSLog(@ "%@" , txtPath);
#pragma mark - NSData写入文件 NSString *dataPath = [docPath stringByAppendingPathComponent:@ "icon.jpg" ];
UIImage *image = [UIImage imageNamed:@ "640*960.jpg" ];
NSData *data = UIImageJPEGRepresentation(image, 1.0);
[data writeToFile:dataPath atomically:YES];
NSLog(@ "dataPath: %@" , dataPath);
#pragma mark - 创建文件夹 NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *testDir = [docPath stringByAppendingPathComponent:@ "test" ];
[fileManager createDirectoryAtPath:testDir withIntermediateDirectories:YES attributes:nil error:nil];
if ([fileManager fileExistsAtPath:testDir]) {
NSLog(@ "It is exist" );
}
// 获取默认问价或者某个文件夹的大小
NSDictionary *dic = [fileManager attributesOfItemAtPath:docPath error:nil];
NSLog(@ "dic: %@" , dic);
NSNumber *number = [dic objectForKey:NSFileSize];
NSLog(@ "number: %@" , number);
} // 文件移动 - ( void )fileMove
{ #pragma mark - 文件移动 // 创建文件夹
NSString *docPath1 = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
NSString *dirPath = [docPath1 stringByAppendingPathComponent:@ "path" ];
NSFileManager *fileManager1 = [NSFileManager defaultManager];
[fileManager1 createDirectoryAtPath:dirPath withIntermediateDirectories:YES attributes:nil error:nil];
// 创建文件
NSString *filePath = [dirPath stringByAppendingPathComponent:@ "test1.txt" ];
[fileManager1 createFileAtPath:filePath contents:nil attributes:nil];
// 将图片对象存入到该文件中
UIImage *image1 = [UIImage imageNamed:@ "640*960.jpg" ];
NSData *data1 = UIImageJPEGRepresentation(image1, 1.0);
[data1 writeToFile:filePath atomically:YES];
NSLog(@ "%@" , filePath);
// 移动文件
NSString *desPath = [docPath1 stringByAppendingPathComponent:@ "test1.txt" ];
[fileManager1 moveItemAtPath:filePath toPath:desPath error:nil];
} // 文件更改 - ( void )changeFile
{ // 1.获取Documents路径
NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
// 2.创建文件路径
NSString *filePath = [docPath stringByAppendingPathComponent:@ "text.txt" ];
// 3.使用文件管理对象创建文件
NSFileManager *fileManager = [NSFileManager defaultManager];
[fileManager createFileAtPath:filePath contents:[@ "abcdefg" dataUsingEncoding:NSUTF8StringEncoding] attributes:nil];
// 4.创建文件对接对象
NSFileHandle *handle = [NSFileHandle fileHandleForUpdatingAtPath:filePath]; // 文件对象此时针对文件,可读可写
// 5.将偏移量移动到3的位置
[handle seekToFileOffset:3];
// 6.写入数据
[handle writeData:[@ "1234" dataUsingEncoding:NSUTF8StringEncoding]];
// 7.执行完操作后,关闭文件
[handle closeFile];
NSLog(@ "%@" , filePath);
}
|