基础篇- 沙盒以及文件的操作和存取

来感受下iOS app的沙盒

官方文档图片,自行感受下

沙盒机制(sandBox)

iOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被称为沙盒,所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等。

  • 每个应用程序都有自己的存储空间。
  • 应用程序不能翻过自己的围墙去访问别的存储空间的内容。
  • 应用程序请求的数据都要通过权限检测,假如不符合条件的话,不会被放行。

如果要访问到其他 App 的范围,必须要获取管理员许可才行,比如地理位置,相册,通讯录,话筒等。这是苹果系统的哲学,苹果认为只有把各个 App 孤立起来才能营造良好的用户体验和安全性。

通过下面的图来看一下苹果的沙盒机制吧.

通过这张图只能从表层上理解sandbox是一种安全体系,应用程序的所有操作都要通过这个体系来执行,其中核心内容是:sandbox对应用程序执行各种操作的权限限制。

沙盒目录结构

默认情况下,每个沙盒含有3个文件夹:Documents, Library 和 Tmp。因为应用的沙盒机制,应用只能在几个目录下读写文件

Documents:苹果建议将程序中建立的或在程序中浏览到的文件数据保存在该目录下,iTunes备份和恢复的时候会包括此目录。

Library:苹果建议用来存放默认设置或其它状态信息。会被iTunes同步但是要除了Caches子目录外。

  • Library/Caches:主要是缓存文件,用户使用过程中缓存都可以保存在这 个目录中。这个目录就用于保存那些可再生的文件,可以重新下载或者重新生成的数据应该保存在目录下面。(比如杂志、新闻、地图应用使用的数据库缓存文件和可下载内容应该保存到这个文件夹)。磁盘空间不够时 系统会删除 不会被iTunes同步。
  • Library/Preferences:应用程序的偏好设置文件。我们使用NSUserDefaults写的设置数据都会保存到该目录下的一个plist文件中,这就是所谓的写道plist中! 会被iTunes同步。

tmp:各种临时文件,保存应用再次启动时不需要的文件。而且,当应用不再需要这些文件时应该主动将其删除,因为该目录下的东西随时有可能被系统清理掉,也可能随着项目退出删掉。不会被iTunes同步。

iPhone在重启时,会丢弃所有的tmp文件。

沙盒文件的操作

获取程序的home目录

  NSString *homeDirectory = NSHomeDirectory();
  NSLog(@"path:%@", homeDirectory);

获取document目录

  NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
  NSString *path = [paths objectAtIndex:0];
  NSLog(@"path:%@", path);

获取Cache目录

  NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
  NSString *path = [paths objectAtIndex:0];
  NSLog(@"%@", path);

获取Library目录

  NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
   NSString *path = [paths objectAtIndex:0];
  NSLog(@"%@", path);

获取Tmp目录

  NSString *tmpDir = NSTemporaryDirectory();
  NSLog(@"%@", tmpDir);

存数据到沙盒plist文件中。

  +(void)writeDataToPlist :(NSMutableArray *)dataArray
  {
        NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
        NSString *path=[paths    objectAtIndex:0];
        NSLog(@"path:%@",path);
        NSString *filename=[path stringByAppendingPathComponent:@"searchHistory.plist"];
        //写入
        NSFileManager* fm = [NSFileManager defaultManager];
        [fm createFileAtPath:filename contents:nil attributes:nil];
        [dataArray writeToFile:filename atomically:YES];
      }

沙盒plist文件读取

   +(NSArray *)getDataFormPlist{

        NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
        NSString *path=[paths objectAtIndex:0];
        NSString *filename=[path stringByAppendingPathComponent:@"searchHistory.plist"];
        //读文件
        NSArray* dataArray = [NSArray arrayWithContentsOfFile:filename];
        return dataArray;
  }

可以查看沙盒的应用

查看真机应用沙盒子

查看模拟器应用沙盒

文件常见操作

判断某文件是否存在

  NSFileManager* fm=[NSFileManager defaultManager];
   if(![fm fileExistsAtPath:[self dataFilePath]]){
      //下面是对该文件进行制定路径的保存
     [fm createDirectoryAtPath:[self dataFilePath] withIntermediateDirectories:YES attributes:nil error:nil];
  }

保存某个文件

可以用 NSFileManager的
  - (BOOL)createFileAtPath:(NSString *)path contents:(NSData *)data attributes:(NSDictionary *)attr;
或 NSData 的
  - (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;
  - (BOOL)writeToFile:(NSString *)path options:(NSUInteger)writeOptionsMask error:(NSError **)errorPtr;

删除文件

 NSFileManager* fm=[NSFileManager defaultManager];
 NSError *myError = nil;
if ([fm removeItemAtPath:@"" error:&myError] == YES){
}

移动文件

NSFileManager* fm=[NSFileManager defaultManager];
 NSError *myError = nil;
if ([fm moveItemAtPath:@"" toPath:@"" error:&myError] == YES){
}

拷贝文件

NSFileManager* fm=[NSFileManager defaultManager];
 NSError *myError = nil;
if ([fm copyItemAtPath:@"" toPath:@"" error:&myError] == YES){
    
}

取得一个目录下得所有文件名

 NSArray *files = [fm subpathsAtPath: [self dataFilePath] ];

读取某个文件

  NSData *data = [fm contentsAtPath:[self dataFilePath]];
  //或者
  NSData *data = [NSData dataWithContentOfPath:[self dataFilePath]];

保存汉字

NSString *fileName=[[paths objectAtIndex:0] stringByAppendingPathComponent:@"myFile.txt"];
NSString *content=@"更深夜静人已息";
NSData *contentData=[content dataUsingEncoding:NSUnicodeStringEncoding];
  if ([contentData writeToFile:fileName atomically:YES]) {
    NSLog(@">>write ok.");
  }

使用工程中的文件

  NSString *myFilePath = [[NSBundle mainBundle] pathForResource:@"f"   ofType:@"txt"];
  NSString *myFileContent=[NSString stringWithContentsOfFile:myFilePath encoding:NSUTF8StringEncoding error:nil];
 NSLog(@"bundel file path: %@ \nfile content:%@",myFilePath,myFileContent);

小结

后续如果有新的相关知识get,会持续更新。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏ShaoYL

iOS----轻松掌握AFN网络顶级框架

32470
来自专栏王大锤

iOS 处理缓存的三种方法

34190
来自专栏ShaoYL

iOS--多线程之线程间通讯

29780
来自专栏進无尽的文章

编码篇 - iOS各种权限状态的获取及注意事项

关于系统权限的获取,相信大家都不陌生,可是其中蕴含的知识确实不少。 怎样向用户索取权限是非常重要的。例如LBS类的应用,如果在索取权限时遭到用户的拒绝,那么该...

69320
来自专栏攻城狮的动态

iOS开发中的这些权限,你搞懂了吗?

34450
来自专栏ios 技术积累

iOS SDWebimage 源码阅读

简介 SDWebimage是 iOS 的图片加载框架。它支持从网络中下载且缓存图片,并设置图片到对应的 UIImageView 控件或者 UIButton 控...

21210
来自专栏谈补锅

控制器和应用数据存储

1、UINavigationController, 继承UIViewController,UINavigationController以栈的形式保存子控制器

11230
来自专栏Jacklin攻城狮

iOS开发中的这些权限,你搞懂了吗?

![Uploading 144446-b8aca7ba38c5f8c0_695906.png . . .]获取相册权限

22340
来自专栏一“技”之长

IOS中调用系统拨打电话与发送短信 原

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString string...

9820
来自专栏一“技”之长

iOS开发swift版异步加载网络图片(带缓存和缺省图片)

    与SDWebImage异步加载网络图片的功能相似,只是代码比较简单,功能没有SD的完善与强大,支持缺省添加图片,支持本地缓存。

18030

扫码关注云+社区

领取腾讯云代金券