欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

iOS 沙盒的机制及文件管理

程序员文章站 2022-04-18 08:28:00
...

沙盒的机制

简介

是iOS系统为了安全考虑提供的一种安全机制,这个机制把iOS系统的封闭性展现的淋漓尽致。

  1. 每个应用在安装时会创建属于自己的沙盒文件(存储空间)。
  2. 每个应用都只能访问当前沙盒目录下面的文件,访问其他应用的沙盒,需要权限。
  3. 所有的非代码文件都要保存在此,例如属性文件plist、文本文件、图像、图标、媒体资源等。
  4. 应用之间只能通过URL scheme来通信。

结构目录

iOS 沙盒的机制及文件管理

  • MyApp.app 应用程序的程序包目录,包含应用程序的本身。由于应用程序必须经过签名,所以不能在运行时对这个目录中的内容进行修改,否则会导致应用程序无法启动。

  • Documents/ 保存应用程序的重要数据文件和用户数据文件等。用户数据基本上都放在这个位置(例如从网上下载的图片或音乐文件),该文件夹在应用程序更新时会自动备份,在连接iTunes时也可以自动同步备份其中的数据。

  • Library:这个目录下有两个子目录,可创建子文件夹。可以用来放置您希望被备份但不希望被用户看到的数据。该路径下的文件夹,除Caches以外,都会被iTunes备份.

    1. Library/Caches: 保存应用程序使用时产生的支持文件和缓存文件(保存应用程序再次启动过程中需要的信息),还有日志文件最好也放在这个目录。iTunes 同步时不会备份该目录并且可能被其他工具清理掉其中的数据。
    2. Library/Preferences: 保存应用程序的偏好设置文件。NSUserDefaults类创建的数据和plist文件都放在这里。会被iTunes备份。
  • tmp/: 保存应用运行时所需要的临时数据。不会被iTunes备份。iPhone重启时,会被清空。

文件管理

获取目录

  1. 获取沙盒根目录路径
   // 获取沙盒根目录路径
    NSString *homeDir = NSHomeDirectory();
   // /var/mobile/Containers/Data/Application/FBE41071-F5DD-4F02-9DFC-E9E473D3C917 
  1. 获取Documents目录路径
   // 获取Documents目录路径
    NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES) firstObject];
   // /var/mobile/Containers/Data/Application/FBE41071-F5DD-4F02-9DFC-E9E473D3C917/Documents 
  1. 获取Library的目录路径
   //获取Library的目录路径
    NSString *libDir = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,NSUserDomainMask,YES) lastObject];
   // /var/mobile/Containers/Data/Application/FBE41071-F5DD-4F02-9DFC-E9E473D3C917/Library 
  1. // 获取cache目录路径
   // 获取cache目录路径
    NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES) firstObject];
   // /var/mobile/Containers/Data/Application/FBE41071-F5DD-4F02-9DFC-E9E473D3C917/Library/Caches 
  1. 获取tmp目录路径
   // 获取tmp目录路径
    NSString *tmpDir =NSTemporaryDirectory();
 // /private/var/mobile/Containers/Data/Application/FBE41071-F5DD-4F02-9DFC-E9E473D3C917/tmp/
  1. 获取应用程序程序包中资源文件路径的方法
   // 获取应用程序程序包中资源文件路径的方法:
    NSString *bundle = [[NSBundle mainBundle] bundlePath];
 // /var/containers/Bundle/Application/4A42EF08-30BA-4C19-B0C9-62903300C2BC/MyApp.app

文件写入及读取

  1. 写入
- (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];
}
   
  1. 读取
- (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  //更改文件的属性
  1. 判断文件是否存在
	// 创建文件管理器
    NSFileManager * fileManager = [NSFileManager defaultManager];
    
    NSString * documents = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
    NSString * filePath = [documents stringByAppendingPathComponent:@"testFile.txt"];
    if ([fileManager fileExistsAtPath:filePath]) {
        NSLog(@"文件已存在");
    }
  1. 创建新文件夹及文件写入
// 在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];
  1. 获取文件夹内所有文件名
    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);
  1. 删除文件
NSFileManager *fileManage = [NSFileManager defaultManager];
[fileManager removeItemAtPath:filePath error:nil]; // filePath为文件路径
相关标签: 沙盒 文件管理