iOS 沙盒的机制及文件管理
程序员文章站
2022-04-18 08:28:00
...
沙盒的机制
简介
是iOS系统为了安全考虑提供的一种安全机制,这个机制把iOS系统的封闭性展现的淋漓尽致。
- 每个应用在安装时会创建属于自己的沙盒文件(存储空间)。
- 每个应用都只能访问当前沙盒目录下面的文件,访问其他应用的沙盒,需要权限。
- 所有的非代码文件都要保存在此,例如属性文件plist、文本文件、图像、图标、媒体资源等。
- 应用之间只能通过URL scheme来通信。
结构目录
-
MyApp.app
应用程序的程序包目录,包含应用程序的本身。由于应用程序必须经过签名,所以不能在运行时对这个目录中的内容进行修改,否则会导致应用程序无法启动。 -
Documents/
保存应用程序的重要数据文件和用户数据文件等。用户数据基本上都放在这个位置(例如从网上下载的图片或音乐文件),该文件夹在应用程序更新时会自动备份,在连接iTunes时也可以自动同步备份其中的数据。 -
Library
:这个目录下有两个子目录,可创建子文件夹。可以用来放置您希望被备份但不希望被用户看到的数据。该路径下的文件夹,除Caches以外,都会被iTunes备份.-
Library/Caches
: 保存应用程序使用时产生的支持文件和缓存文件(保存应用程序再次启动过程中需要的信息),还有日志文件最好也放在这个目录。iTunes 同步时不会备份该目录并且可能被其他工具清理掉其中的数据。 -
Library/Preferences
: 保存应用程序的偏好设置文件。NSUserDefaults类创建的数据和plist文件都放在这里。会被iTunes备份。
-
-
tmp/
: 保存应用运行时所需要的临时数据。不会被iTunes备份。iPhone重启时,会被清空。
文件管理
获取目录
- 获取沙盒根目录路径
// 获取沙盒根目录路径
NSString *homeDir = NSHomeDirectory();
// /var/mobile/Containers/Data/Application/FBE41071-F5DD-4F02-9DFC-E9E473D3C917
- 获取Documents目录路径
// 获取Documents目录路径
NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES) firstObject];
// /var/mobile/Containers/Data/Application/FBE41071-F5DD-4F02-9DFC-E9E473D3C917/Documents
- 获取Library的目录路径
//获取Library的目录路径
NSString *libDir = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,NSUserDomainMask,YES) lastObject];
// /var/mobile/Containers/Data/Application/FBE41071-F5DD-4F02-9DFC-E9E473D3C917/Library
- // 获取cache目录路径
// 获取cache目录路径
NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES) firstObject];
// /var/mobile/Containers/Data/Application/FBE41071-F5DD-4F02-9DFC-E9E473D3C917/Library/Caches
- 获取tmp目录路径
// 获取tmp目录路径
NSString *tmpDir =NSTemporaryDirectory();
// /private/var/mobile/Containers/Data/Application/FBE41071-F5DD-4F02-9DFC-E9E473D3C917/tmp/
- 获取应用程序程序包中资源文件路径的方法
// 获取应用程序程序包中资源文件路径的方法:
NSString *bundle = [[NSBundle mainBundle] bundlePath];
// /var/containers/Bundle/Application/4A42EF08-30BA-4C19-B0C9-62903300C2BC/MyApp.app
文件写入及读取
- 写入
- (void)writing {
NSString *docDir =[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES) firstObject];
NSArray *array = [[NSArray alloc] initWithObjects:@"内容",@"content",nil];
NSString *filePath = [docDir stringByAppendingPathComponent:@"testFile.txt"];
[array writeToFile:filePath atomically:YES];
}
- 读取
- (void)reading {
NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES) firstObject];
NSString *filePath = [docDir stringByAppendingPathComponent:@"testFile.txt"];
NSArray *array = [[NSArray alloc]initWithContentsOfFile:filePath];
}
文件管理器NSFileManager
常见的NSFileManager文件方法
-(NSData *)contentsAtPath:path //从一个文件读取数据
-(BOOL)createFileAtPath: path contents:(NSData *)data attributes:attr //向一个文件写入数据
-(BOOL)removeItemAtPath:path error:err //删除一个文件
-(BOOL)moveItemAtPath:from toPath:to error:err //重命名或者移动一个文件(to不能是已存在的)
-(BOOL)copyItemAtPath:from toPath:to error:err //复制文件(to不能是已存在的)
-(BOOL)contentsEqualAtPath:path andPath:path2 //比较两个文件的内容
-(BOOL)fileExistAtPath:path //测试文件是否存在
-(BOOL)isReadableFileAtPath:path //测试文件是否存在,并且是否能执行读操作
-(BOOL)isWriteableFileAtPath:path //测试文件是否存在,并且是否能执行写操作
-(NSDictionary *)attributesOfItemAtPath:path error:err //获取文件的属性
-(BOOL)setAttributesOfItemAtPath:attr error:err //更改文件的属性
- 判断文件是否存在
// 创建文件管理器
NSFileManager * fileManager = [NSFileManager defaultManager];
NSString * documents = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
NSString * filePath = [documents stringByAppendingPathComponent:@"testFile.txt"];
if ([fileManager fileExistsAtPath:filePath]) {
NSLog(@"文件已存在");
}
- 创建新文件夹及文件写入
// 在Documents里创建目录
NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *testDirectory = [documentsDirectory stringByAppendingPathComponent:@"test"];
// 创建目录
[fileManager createDirectoryAtPath:testDirectory withIntermediateDirectories:YES attributes:nil error:nil];
// 在目录下创建文件
NSString *testPath = [testDirectory stringByAppendingPathComponent:@"test00.txt"];
NSString *string = @"写入内容,write String";
[fileManager createFileAtPath:testPath contents:[string dataUsingEncoding:NSUTF8StringEncoding] attributes:nil];
- 获取文件夹内所有文件名
subpathsOfDirectoryAtPath:
与subpathsAtPath:
方法都可
NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
NSFileManager *fileManage = [NSFileManager defaultManager];
NSString *myDirectory = [documentsDirectory stringByAppendingPathComponent:@"test"];
NSArray *file = [fileManage subpathsOfDirectoryAtPath: myDirectory error:nil];
NSLog(@"%@",file);
// NSArray *file2 = [fileManage subpathsAtPath: myDirectory ];
// NSLog(@"%@",file2);
- 删除文件
NSFileManager *fileManage = [NSFileManager defaultManager];
[fileManager removeItemAtPath:filePath error:nil]; // filePath为文件路径