应用程序沙盒简介:iOS应用程序只能在系统为它分配的文件区域内读写文件,这个区域就是此应用程序的沙盒,Application目录下的GUID文件夹就是沙盒,这个文件夹是系统随机命名的。程序所有的非代码文件都保存在这里。文件夹下的结构如下:

  1. Document:除了基于NSUserDefaults的首选项设置外,应用程序的运行状态、用户数据、文件都保存在该目录下,用函数NSSearchPathForDirectoriesInDomains()
    获取该文件夹:

     // NSDocumentDirectory代表正在搜索Documents文件夹,NSUserDomainMask代表只搜索应用程序沙盒,返回的是所有符合条件的目录集合。
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *path = paths.lastObject;
  2. Library:基于NSUserDefault的首选项参数保存在该目录的Preferences目录下。
  3. tep:用于存储应用程序的临时文件,iTunes不会备份该目录下的文件,用函数NSTemporaryDirectory()获取tmp目录的完整路径。

下面将逐步介绍有关iOS数据存储的相关知识。。。。

一、NSData

  • dataWithContentsOfFile:用读取到的文件内容初始化NSData。
  • dataWithContentsOfURL:用读取URL关联到的内容初始化NS Data。
  • bytes:返回NSData对象所包含的数据。
  • writeToFile:atomically:将NSData数据写入文件。
  • writeToURL:atomically:将NSData数据写入URL对应的资源。

二、NSFileManager

1、NSFileManager常用概念:

采用文件名作为文件的唯一标识符,即每个文件名都对应一个NSString对象。这里先引入两个概念

  • 相对路径:以当前路径为基础路径,不以斜线开头。同一个相对路径所代表的文件,可能会不同。
  • 绝对路径:以斜线开头的路径,绝对路径是唯一的,它代表的路径或目录是固定的。

开头是"/",代表根目录:/Users/abc。

开头是"~",代表当前用户的home目录:如用户是zhangsan,"~"就代表了/Users/zhangsan,也可写成~zhangsan。

开头是".",代表当前目录。

开头是"..",代表当前目录的上一级目录。

2、NSFileManager常用的方法:

  • fileExistsAtPath:判断路径对应的文件或目录是否存在。

     NSFileManager *fm = [NSFileManager defaultManager];
    NSString *path = @"/Users/hanlulu/Desktop/abc.txt";
    if ([fm fileExistsAtPath:path]) {
    NSLog(@"存在");
    } else {
    NSLog(@"不存在");
    }
  • fileExistsAtPath:isDirectory:判断路径对应的文件或目录是否存在,后一个参数用来判断是否为目录。
     NSFileManager *fm = [NSFileManager defaultManager];
    NSString *path = @"/Users/hanlulu/Desktop/abc.txt";
    BOOL isDir;
    if ([fm fileExistsAtPath:path isDirectory:&isDir]) {
    NSLog(@"存在");
    if (isDir) {
    NSLog(@"是目录");
    } else {
    NSLog(@"不是目录");
    }
    } else {
    NSLog(@"不存在");
    }
  • componentsToDisplayForPath:获取路径对应的文件的各个路径组件,返回NSArray。
     NSFileManager *fm = [NSFileManager defaultManager];
    NSString *path = @"/Users/hanlulu/Desktop/abc.txt";
    NSArray *dirs = [fm componentsToDisplayForPath:path];
    for (NSString *dir in dirs) {
    NSLog(@"%@", dir);
    }
  • attributesOfItemAtPath:error:获取路径对应的文件的属性,返回字典:dict[NSFileCreationDate]是创建时间,dict[NSFileSize]是文件大小。
     NSFileManager *fm = [NSFileManager defaultManager];
    NSString *path = @"/Users/hanlulu/Desktop/abc.txt";
    NSDictionary *dict = [fm attributesOfItemAtPath:path error:nil];
    NSLog(@"文件大小:%@,创建时间:%@。", dict[NSFileSize], dict[NSFileCreationDate]);
  • contentsAtPath:获取路径对应的文件的内容,返回NSData。
  • contentsEqualAtPath:andPath:判断两个路径对应的文件内容是否相同。
  • createDirectoryAtPath:withIntermediateDirectories:attributes:error:根据指定的路径创建目录。第二个参数是设置在父目录不存在的情况下是否要创建父目录。
     NSFileManager *fm = [NSFileManager defaultManager];
    NSString *path = @"/Users/hanlulu/Desktop/hehe/haha";
    NSError *error = nil;
    // 当hehe文件夹不存在时,YES能自动创建hehe,NO则不创建hehe并返回error错误信息。
    [fm createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:&error];
  • creatFileAtPath:contents:attributes:根据指定的路径、内容创建文件。
     NSFileManager *fm = [NSFileManager defaultManager];
    NSString *path = @"/Users/hanlulu/Desktop/hehe/haha/abc.txt";
    [fm createFileAtPath:path contents:[@"这是一条内容。" dataUsingEncoding:NSUTF8StringEncoding] attributes:nil];
  • removeItemAtPath:error:删除指定路径对应的文件。
     NSFileManager *fm = [NSFileManager defaultManager];
    NSString *path = @"/Users/hanlulu/Desktop/hehe/haha/abc.txt";
    [fm removeItemAtPath:path error:nil];
  • copyItemAtPath:toPath:error:根据指定路径复制文件或目录。
  • moveItemAtPath:toPath:error:根据指定路径移动文件或目录。
     NSFileManager *fm = [NSFileManager defaultManager];
    NSString *path = @"/Users/hanlulu/Desktop/hehe/haha/abc.txt";
    NSString *toPath = @"/Users/hanlulu/Desktop/hehe/abc.txt";
    [fm moveItemAtPath:path toPath:toPath error:nil];
  • contentsOfDirectoryAtPath:error:获取指定目录下所有文件和子目录。对子目录不会进行递归枚举。
     NSFileManager *fm = [NSFileManager defaultManager];
    NSString *path = @"/Users/hanlulu/Desktop";
    NSArray *array = [fm contentsOfDirectoryAtPath:path error:nil];
    for (NSString *item in array) {
    NSLog(@"%@", item);
    }
  • enumeratorAtPath:获取指定目录下所有文件和子目录的枚举器(NSDirectoryEnumerator对象),如果目下存在子目录,则进行递归枚举子目录的所有内容,也可调用NSDirectoryEnumerator对象的skipDescendants方法阻止递归枚举。
     NSFileManager *fm = [NSFileManager defaultManager];
    NSString *path = @"/Users/hanlulu/Desktop/hehe";
    NSDirectoryEnumerator *dirEnum = [fm enumeratorAtPath:path];
    NSString *file = nil;
    while (file = [dirEnum nextObject]) {
    NSLog(@"%@", file);
    }
  • subpathsOfDirectoryAtPath:error:以递归的的方式获取指定目录下的所有目录以及子目录。
  • subpathAtPath:此方法和上面方法类似。
     NSFileManager *fm = [NSFileManager defaultManager];
    NSString *path = @"/Users/hanlulu/Desktop/hehe";
    NSArray *array = [fm subpathsAtPath:path];
    for (NSString *item in array) {
    NSLog(@"%@", item);
    }

三、NSPathUtilities.h

1、NSPathUtilities.h是NSString类的扩展,在分类NSStringPathExtensions中主要提供了一些专门操纵路径的方法和属性:

  • - (NSArray *)pathComponents; 分拆路径,返回该路径中各部分所组成的数组。
  • - (NSString *)lastPathComponent; 获取该路径的最后一个组成部分。
  • - (NSString *)pathExtension; 获取该路径的最后一个组成部分的扩展名。
  • - (NSString *)stringByAppendingPathComponent:path:; 将path添加到指定路径的结尾处。
  • - (NSString *)stringByAppendingPathExtension:ext:; 将ext扩展名添加到指定路径的结尾处。
  • - (NSString *)stringByDeletingLastPathComponent:; 删除路径的最后一个组成部分。
  • - (NSString *)stringByDeletingPathExtension:; 删除路径的最后一个组成部分的扩展名。

2、下列函数用来获取系统相关属性:

  • NSUserName():;返回当前用户名。
  • NSFullUserName():; 返回当前用户的完整用户名。
  • NSHomeDirectory():; 返回当前用户的home目录。
  • NSHomeDirectoryForUser(user): ; 返回指定用户的home目录。
  • NSTemporaryDirectory():; 返回系统的临时目录。

四、NSProcessInfo

NSProcessInfo对象可以用于获取当前进程的相关信息:

  • environment: 返回系统内所有环境变量名和值组成的NSDictionary对象。
  • precessIdentifier:返回该进程的标识符。
  • processName:返回该进程的进程名。
  • setProcessName: 设置进程的进程名。
  • hostName: 返回进程所在系统的主机名。
  • operatingSystemVersion:返回进程所在系统的操作系统版本。
  • operatingSystemVersionString:返回进程所在系统的操作系统版本号。
  • physicalMemory:返回系统的物理内存。
  • processorCount:返回系统中CPU的数量。
  • systemUptime:返回系统已运行的时间。

五、NSFileHandle

NSFileHandle提供了大量处理文件IO的方法,详见该类的头文件。其基本使用步骤如下:

  • 创建一个NSFileHandle对象,它会打开指定的文件。
  • 调用NSFileHandle的一些方法,对打开的文件执行IO操作。
  • 关闭文件。

NSFileHandle没有提供创建文件的功能,这里需使用NSFileManager来创建。

NSFileHandle还提供了很多用于后台读写的方法,大多数以InBackgroundAndNotify结尾,这些操作是异步进行的,不会阻塞前台线程,在读写完成后会向前台发送一个通知。

 更多请移步至 数据存储与IO(二)

数据存储与IO(一)的更多相关文章

  1. android学习笔记45——android的数据存储和IO

    android的数据存储和IO SharedPreferences与Editor简介 SharedPreferences保存的数据主要是类似于配置信息格式的数据,因此其保存的数据主要是简单的类型的ke ...

  2. 【Android】数据存储-java IO流文件存储

    1.数据持久化:将在内存中的瞬时数据保存在存储设备中.瞬时数据:设备关机数据丢失.持久化技术提供一种机制可以让数据在瞬时状态和持久状态之间转换. 2.Android中简单的三种存储方式:文件存储.Sh ...

  3. Android数据存储之IO

    Android开发中免不了数据本地的存储,今天我们来说一说怎样利用IO流来进行数据存储. 这里我们通过模拟一个QQ登陆界面的小demo来实际操作IO流. 功能描写叙述:点击button能够保存用户输入 ...

  4. 数据存储与IO(二)

    一.NSBundle资源包. 只要把文件拖到Xcode左边项目导航面板中,选择复制文件到项目中,该文件就包含进bundle中了.用[NSBundle mainBundle]获取应用程序包,常用的方法: ...

  5. IOS高级编程之二:IOS的数据存储与IO

    一.应用程序沙盒 IOS应用程序职能在系统为该应用所分配的文件区域下读写文件,这个文件区域就是应用程序沙盒.所有的非代码文件如:图片.声音.映象等等都存放在此. 在mac中command+shift+ ...

  6. 第8章 Android数据存储与IO——File存储

    openFileOutput/openFileInput 这是android自带的两种解决方案.

  7. 【原创Android游戏】--猜数字游戏V1.1 --数据存储,Intent,SimpleAdapter的学习与应用

    --------------------------------------------------------------- V0.1版本 上次做完第一个版本后,发现还有一些漏洞,并且还有一些可以添 ...

  8. Java基础知识强化之IO流笔记46:IO流练习之 把文本文件中数据存储到集合中的案例

    1.  把文本文件中数据存储到集合中      需求:从文本文件中读取数据(每一行为一个字符串数据)到集合中,并遍历集合. 分析:      通过题目的意思我们可以知道如下的一些内容,      数据 ...

  9. Java基础知识强化之IO流笔记45:IO流练习之 把集合中的数据存储到文本文件案例

    1. 把集合中的数据存储到文本文件案例:    需求:把ArrayList集合中的字符串数据存储到文本文件 ? (1)分析:通过题目的意思我们可以知道如下的一些内容,ArrayList集合里存储的是字 ...

随机推荐

  1. 2005 TCO Online Round 1 - RectangleError

    RectangleError Problem's Link Problem Statement You want to draw a rectangle on a piece of paper. Un ...

  2. ASP.NET MVC案例——————拦截器

    摘要      本文将对“MVC公告发布系统”的发布公告功能添加日志功能和异常处理功能,借此来讨论ASP.NET MVC中拦截器的使用方法. 一个小难题      我们继续完善“MVC公告发布系统”, ...

  3. (二)NetHelper

    [转]http://blog.csdn.net/dingxiaowei2013/article/details/8113454 using System; using System.Text; usi ...

  4. c#获取当前应用程序所在路径

    一.获取当前文件的路径1.   System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName     获取模块的完整路径,包括文 ...

  5. Windows Server 2012中配置AD域服务

    1.安装完AD域服务后,我们返回服务器管理器界面,点击"将此服务器提升为域控制器",选择"添加新林". 输入域名称:contoso.com 2.按图中所示选择林 ...

  6. 获取枚举值上的Description特性说明

    /// <summary> /// 获取枚举值上的Description特性说明 /// </summary> /// <typeparam name="T&q ...

  7. jquery练习(赋予属性值)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. 双系统下删除Linux系统方法和Windows无法启动问题的解决方法

    装了一个linux,后面直接把它删掉了,结果电脑重启的时候重启不了,总是一开机就出现     grub>   心中无比的恼火,后面想不通了,就打算直接重装系统,结果重装系统的过程中遇到了问题,B ...

  9. soap缓存问题

    问题描述: ws提供方在原有基础上增加了一个方法,通过php的soap扩展硬是获取不到该方法,提示,该方法不存在. 问题跟节: soap缓存问题,导致无法获取最新的ws文件信息 解决办法: 1.直接在 ...

  10. 历史疑团之EJB

    在学习Sping框架的过程中,看到过很多次关于EJB的批判.使用了SpringMVC但是并没有真性情般体会到它的优点,所以有必要对传统的Java Bean和EJB来做一些了解,无奈百度搜了很多知识,还 ...