沙盒-初学者基本知识点

一、应用程序沙盒的基本概念

1、iOS中的沙盒(sandbox)机制

 1)iOS应用程序只能对自己创建的文件系统读取文件,这个"独立","封闭","安全"的空间,称之为沙盒,所有的非代码文件都要保存在此。

 2)它一般存放着你程序包文件(可执行文件)、图片、声音、视频、plist、sqlite数据库以及其他文件

 3)每个应用程序都有自己的独立的存储空间(沙盒),一般情况下应用程序是不可以相互访问沙盒,也有例外,比如系统通讯录能在用户授权的情况下被第三方应用访问

2、沙盒目录文件的组成以及相关含义 (每一个IOS应用系统都有一个沙盒,沙盒里面包括4部分,原则上沙盒之间是不能互相访问的)

 当我们创建我们的应用程序时,在每个沙盒中默认含有4个文件,如下:

 1.Documnets: 

   一般我们需要持久的数据都放在这个目录中,你可以在当中添加子文件夹,需要注意的是,Documents 存放不会被删除的文件,iTunes备份和恢复的时候,会包括此目录,不能放太大的文件.不然苹果审核会被拒掉

 2.Library:

   设置程序的默认设置和其他状态信息

    1). Library/Caches:存放缓存文件,应用程序再次启动过程中需要的信息,Caches (缓存) 一般放体积比较大,不重要的资源,itenus不会备份

    2). Library/Preferences:包含应用程序的偏好设置文件,preferences 不要随意动他,通过使用NSUserDefault类取得应用程序的偏好,itunes会备份

 3.tmp: 

   创建临时文件的目录,tmp 保存应用的临时数据,itunes不会同步该目录,长时间不用可能会被程序删掉,重启iphone时会被删掉

 4.程序.app,与另三个路径的父路径不同

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

二、获取沙盒目录

注意:所有的路径都是字符串,接收路径都必须用 NSString *---Path 路径对象名字根据自己的需要来写了

1、获取到沙盒的根目录

   NSString *homePath = NSHomeDirectory();

2、获取Documents目录

   NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
   NSUserDomainMask, YES);//没有办法直接用方法得到路径的,就先用这样的方法把目标路径放到数组里面,然后再取到地址
   
   NSString *documentsPath = [paths lastObject];  

3、获取Library中的Cache

   NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask, YES);

   NSString *cachePath = [paths lastObject];

4、获取tmp路径

   NSString *tempPath = NSTemporaryDirectory();

5、获取程序包文件路径

   //获取到程序包路径
  NSString *boundlePaht = [[NSBundle mainBundle] resourcePath];                       

  NSLog(@"程序包路径=%@",boundlePaht);

三.文件和文件夹的创建过程 (下面的“1”和“2”的内容是不一样的)

1.新建其他文件路径的方法(注意:仅仅是建立文件路径,不是文件夹,也不是文件)

  获取沙盒里面已经存在的路径(参考"二"里面的获取方法)

  比如我们在tmp文件夹里面新建一个文件"word.text"路径

  NSString *tmpPath = NSTempporaryDirectory;

  NSString *newPath = [tmpPat stringByAppendingPathComponent:@"word.text"];

2.新建一个文件(白色的文件)建一个"乐园.text"文件,只能存放文件内容,而不能存放文件夹

    //准备路径
    NSString *homePath = NSHomeDirectory();
    NSString *filePath = [homePath stringByAppendingPathComponent:@"乐园.text"];
    
    //准备内容
    NSString *contentStr = @"我喜欢你们";
    NSData *contentData = [contentStr dataUsingEncoding:NSUTF8StringEncoding];//计算机只能识别人二进制代码,把字符串转化为计算机能够是别的语言
    
    
    NSFileManager *fileManager = [NSFileManager defaultManager];//建立一个资源管理器,用来处理文件,单例模式
    
    BOOL isSuccess = YES;

//很关键的一步来真正建立好一个文件

   isSuccess =
    [fileManger createDirectoryAtPath:filePath withIntermediateDirectories:YES attributes:nil error:nil];
    
    if (isSuccess == YES) {
        
        NSLog(@"文件创建成功");
        NSLog(@"%@",filePath);
    }

3.新建一个文件夹(蓝色的文件夹)建一个"乐园.text"文件夹,可以存放文件

 //准备路径
    NSString *homePath = NSHomeDirectory();
    NSString *filePath = [homePath stringByAppendingPathComponent:@"乐园.text"];
    
    //准备内容
    NSString *contentStr = @"我喜欢你们";
    NSData *contentData = [contentStr dataUsingEncoding:NSUTF8StringEncoding];//计算机只能识别人二进制代码,把字符串转化为计算机能够是别的语言
    
    
    NSFileManager *fileManager = [NSFileManager defaultManager];//建立一个资源管理器,用来处理文件,单例模式
    
    BOOL isSuccess = YES;

//很关键的一步来真正建立好一个文件夹

   isSuccess = [fileManager createFileAtPath:filePath contents:contentData attributes:nil]; 
    
    if (isSuccess == YES) {
        
        NSLog(@"文件夹创建成功");
        NSLog(@"%@",filePath);
    }

四、文件目录的处理方法(通过路径来修改)

    有些时候我们需要对获取到的文件目录做一些特殊处理,常用的方法有以下几个:
    
     NSString *paths = @"/Users/apple/testfile.text";

    #pragma mark  1  分解路径中的元素,并放到一个数组里面
    
       NSArray *pathArray = [paths pathComponents];
        
       NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
    
    #pragma mark  2  获取到路径里面最后一个元素
    
       NSString *path5 = [paths lastPathComponent];或者
    
       NSString *path5 = [paths lastObject];

    
    #pragma mark  3  删除路径里面的最后一个元素
    
       NSString *path6 = [paths stringByDeletingLastPathComponent];
    
    #pragma mark  4  在路径后面拼接元素
    
       NSString *path7 = [paths stringByAppendingPathComponent:@"天下无敌.text"];
    
    #pragma mark  5   获取到文件的扩展名
    
       NSString *path8 = [path7 pathExtension];  //extension |ɪkˈstenʃn|   扩展名  如:.text
    
       NSLog(@"%@",path8);
    
    #pragma mark  6   删除扩展名
    
       NSString *path9 = [path7 stringByDeletingPathExtension];
    
    
    #pragma mark 7 增加扩展名
    
        NSString *path10 = [path9 stringByAppendingPathExtension:@"pdf"];
    
    
    #pragma  mark 8  找到桌面上的“截图”文件夹
    
        NSString *path = @"/Users/wangchong/Desktop";
    
        NSString *text = [path stringByAppendingString:@"NSFileMange"];//NSFileMange是我桌面上的文件夹的名字

五.NSData的基本概念(字符串和二进制数据的转换)

 NSData是用来包装数据用的

 NSData存储的是二进制数据,这样就屏蔽了数据之间的差异,文本、音频、图像等数

 据都可以用NSData来存储

  NSMutableData继承NSData类,可以对该对象进行数据修改
  NSString *test = @"字符串哈哈";
    
    //  string -> data
    
    NSData *dataTest = [test dataUsingEncoding:NSUTF8StringEncoding];
    
    //  data -> string
    
    NSString *str = [[NSString alloc]initWithData:dataTest encoding:NSUTF8StringEncoding];

六.计算文件和文件夹的容量

  1. 第一. 获取文件数据的方式 :

    1). 用方法获取
    NSData *receiveData = [fileManger contentsAtPath:filePath]; //filePath是有内容的文件路径

    2). 创建fileHandle对象

    NSFileHandle *fileHandle1 = [NSFileHandle fileHandleForReadingAtPath:filePath]; //filePath是有内容的文件路径
    
    NSData *data = [fileHandle1 readDataToEndOfFile]; //全部读取文件内容
    

2.计算文件夹的容量

      获取到文件夹下的所有文件名,放到一个枚举器里面
    
      NSDirectoryEnumerator *files = [fileManger enumeratorAtPath:direcPath];
    
      获取到枚举器里面的第一个文件
     
      NSString *path = [files nextObject];
    
      NSInteger fileNum = 0;
    
      while (path != nil)
     
      {
        
        NSLog(@"沙盒=%@",path);
        
        //将文件路径拼接完整
        
        NSString *path2 = [direcPath1 stringByAppendingPathComponent:path];
        
        //通过attributesOfItemAtPath获取指定路径文件信息
        
        NSDictionary *attrDic = [fileManger attributesOfItemAtPath:direcPath error:nil];
         
        //获取到文件的大小
        
        NSNumber *fileSize = attrDic[NSFileSize];
        
        //将NSNumber转化为int
    
        fileNum = [fileSize intValue];
        
        //取出来下一个文件
        
        path = [files nextObject];

       }

七.文件的移动 (对文件的操作都需要通过路径来完成)

切记:文件的移动,移除,复制,更改名字,都需要给它设置一个新的名字

同时文件是不可以放在文件里面的,但是文件是可以放在文件夹里面的

   #pragma mark 移动文件 目标路径也需要带一个文件名

    NSString *targetPaht = NSHomeDirectory();
    
    targetPaht = [targetPaht stringByAppendingPathComponent:@"test.text"];
    
    Bool isSuccess = [fileManger moveItemAtPath:filePath toPath:targetPaht error:nil];
    
    if (isSuccess == YES) {
        
        NSLog(@"移动成功");
    }
    
     #pragma mark 复制文件
    
    NSString *homeFilePath = NSHomeDirectory();
    
    homeFilePath = [homeFilePath stringByAppendingPathComponent:@"test2.text"];
    
   //在根目录在复制一份文件
     Bool isSuccess = [fileManger copyItemAtPath:targetPaht toPath:homeFilePath error:nil];
    
    
    if (isSuccess == YES) {
        NSLog(@"复制成功");
    }

     #pragma mark 移除文件   

    Bool isSuccess = [fileManger removeItemAtPath:filePath error:nill];

     if (isSuccess == YES) {
        NSLog(@"复制成功");
    }

八.NFFileHandle的用法(它是用来专门处理文件内容的) 处理完文件一定要记得关闭文件,否则会内存泄漏

    //准备路径
    NSString *homePath = NSHomeDirectory();
    NSString *filePath = [homePath stringByAppendingPathComponent:@"Chinese.text"];
    
    //准备内容
    NSString *contentStr = @"strf";
    NSData *contentData = [contentStr dataUsingEncoding:NSUTF8StringEncoding];
    
    
    NSFileManager *fileManager = [NSFileManager defaultManager];
    
    BOOL isSuccess = YES;
    
   isSuccess = [fileManager createFileAtPath:filePath contents:contentData attributes:nil];
    
    if (isSuccess == YES) {
        
        NSLog(@"文件创建成功");
        NSLog(@"%@",filePath);
    }
    
    
#pragma mark 1.追加数据
   
    
    //获取NSFileHandle对象
    NSFileHandle *fileHandle = [NSFileHandle fileHandleForUpdatingAtPath:filePath];
    
    //指定在哪个位置追加数据
    [fileHandle seekToEndOfFile];
    
    NSString *str = @"追加的数据";
    NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
    
    //利用fileHandle向文件写入数据
    [fileHandle writeData:data];
    
    //关闭文件
    [fileHandle closeFile];
    
    
 #pragma mark 2.定位读取数据
    
   //创建fileHandle对象
    NSFileHandle *fileHandle = [NSFileHandle fileHandleForReadingAtPath:filePath];
    
    //获取到文件中可用数据的大小
    NSUInteger length = [fileHandle availableData].length;
    
    //指定从哪里开始读取
    [fileHandle seekToFileOffset:length/2];//断点续传会保留文件偏移量
    
    //读取数据
    NSData *data = [fileHandle readDataToEndOfFile];
    
    //将data转化为string
    NSString *str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
    
    NSLog(@"%@",str);
    
    
 #pragma mark 3.复制文件
    
    NSString *homePath = NSHomeDirectory();
    
    //找到源文件路径
    NSString *sourcePath = [homePath stringByAppendingPathComponent:@"Chinese.text"];
    
    //指定目标文件路径
    NSString *tagetPath = [homePath stringByAppendingPathComponent:@"复制后.text"];
    
    //创建一个文件管理器对象
    NSFileManager *fileManager = [NSFileManager defaultManager];
    
    BOOL success = [fileManager createFileAtPath:tagetPath contents:nil attributes:nil];
    if (success) {
        NSLog(@"create success");
    }
    
    //通过outFileHandle往文件内写东西
    NSFileHandle *outFileHandle = [NSFileHandle fileHandleForWritingAtPath:tagetPath];
    
    
    //通过inFileHandle读取文件中的内容
    NSFileHandle *inFileHandle = [NSFileHandle fileHandleForReadingAtPath:sourcePath];
    
    
    NSData *data = [inFileHandle readDataToEndOfFile];
    
    
    NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    NSLog(@"%@",str);
    
    [outFileHandle writeData:data];
    
    [outFileHandle closeFile];
    [inFileHandle closeFile];
    
    NSLog(@"%@",NSHomeDirectory());

九.总结

掌握:1.沙盒代表一个iOS应用程序的管理器内存地址
     2.文件和文件夹的设置以及文件他们的变化
     3.内存大小的计算利用利用枚举器和字典
     4.NSFileManger和N�SFileHandle的用法,一个应用程序只有一个资源管理器N�SileManger来操作所有的文件,文件内容的操作都用N�SileHandle

十.补充(创建文件夹)

创建的文件夹叫做:
/Users/wangchong/Library/Developer/CoreSimulator/Devices/3FCB4033-D0BB-4932-AA85-6A24C9BB4436/data/Containers/Data/Application/1D0F8593-821D-4946-B42E-E1B188DA9993/Documents/wpdf

- (NSString *)str:(NSString *)_pdfPath {

if (_pdfPath == nil)
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *pdfDir = [[paths firstObject] stringByAppendingPathComponent:@"wpdf"];
    if ([[NSFileManager defaultManager] fileExistsAtPath:pdfDir]) {
        return pdfDir;
    }
    [[NSFileManager defaultManager] createDirectoryAtPath:pdfDir withIntermediateDirectories:YES attributes:nil error:nil];
    _pdfPath = pdfDir;
}
  return _pdfPath;
}

欢迎大家指正!!!
如果有帮助请点喜欢,给点鼓励!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,172评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,346评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,788评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,299评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,409评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,467评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,476评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,262评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,699评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,994评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,167评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,499评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,149评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,387评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,028评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,055评论 2 352

推荐阅读更多精彩内容