• 数据存储与IO(一)


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

    1. Document:除了基于NSUserDefaults的首选项设置外,应用程序的运行状态、用户数据、文件都保存在该目录下,用函数NSSearchPathForDirectoriesInDomains()
      获取该文件夹:
      1 // NSDocumentDirectory代表正在搜索Documents文件夹,NSUserDomainMask代表只搜索应用程序沙盒,返回的是所有符合条件的目录集合。
      2 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
      3 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:判断路径对应的文件或目录是否存在。
      1 NSFileManager *fm = [NSFileManager defaultManager];
      2 NSString *path = @"/Users/hanlulu/Desktop/abc.txt";
      3 if ([fm fileExistsAtPath:path]) {
      4     NSLog(@"存在");
      5 } else {
      6     NSLog(@"不存在");
      7 }
    • fileExistsAtPath:isDirectory:判断路径对应的文件或目录是否存在,后一个参数用来判断是否为目录。
       1 NSFileManager *fm = [NSFileManager defaultManager];
       2 NSString *path = @"/Users/hanlulu/Desktop/abc.txt";
       3 BOOL isDir;
       4 if ([fm fileExistsAtPath:path isDirectory:&isDir]) {
       5     NSLog(@"存在");
       6     if (isDir) {
       7         NSLog(@"是目录");
       8     } else {
       9         NSLog(@"不是目录");
      10     }
      11 } else {
      12     NSLog(@"不存在");
      13 }
    • componentsToDisplayForPath:获取路径对应的文件的各个路径组件,返回NSArray。
      1 NSFileManager *fm = [NSFileManager defaultManager];
      2 NSString *path = @"/Users/hanlulu/Desktop/abc.txt";
      3 NSArray *dirs = [fm componentsToDisplayForPath:path];
      4 for (NSString *dir in dirs) {
      5     NSLog(@"%@", dir);
      6 }
    • attributesOfItemAtPath:error:获取路径对应的文件的属性,返回字典:dict[NSFileCreationDate]是创建时间,dict[NSFileSize]是文件大小。
      1 NSFileManager *fm = [NSFileManager defaultManager];
      2 NSString *path = @"/Users/hanlulu/Desktop/abc.txt";
      3 NSDictionary *dict = [fm attributesOfItemAtPath:path error:nil];
      4 NSLog(@"文件大小:%@,创建时间:%@。", dict[NSFileSize], dict[NSFileCreationDate]);
    • contentsAtPath:获取路径对应的文件的内容,返回NSData。
    • contentsEqualAtPath:andPath:判断两个路径对应的文件内容是否相同。
    • createDirectoryAtPath:withIntermediateDirectories:attributes:error:根据指定的路径创建目录。第二个参数是设置在父目录不存在的情况下是否要创建父目录。
      1 NSFileManager *fm = [NSFileManager defaultManager];
      2 NSString *path = @"/Users/hanlulu/Desktop/hehe/haha";
      3 NSError *error = nil;
      4 // 当hehe文件夹不存在时,YES能自动创建hehe,NO则不创建hehe并返回error错误信息。
      5 [fm createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:&error];
    • creatFileAtPath:contents:attributes:根据指定的路径、内容创建文件。
      1 NSFileManager *fm = [NSFileManager defaultManager];
      2 NSString *path = @"/Users/hanlulu/Desktop/hehe/haha/abc.txt";
      3 [fm createFileAtPath:path contents:[@"这是一条内容。" dataUsingEncoding:NSUTF8StringEncoding] attributes:nil];
    • removeItemAtPath:error:删除指定路径对应的文件。
      1 NSFileManager *fm = [NSFileManager defaultManager];
      2 NSString *path = @"/Users/hanlulu/Desktop/hehe/haha/abc.txt";
      3 [fm removeItemAtPath:path error:nil];
    • copyItemAtPath:toPath:error:根据指定路径复制文件或目录。
    • moveItemAtPath:toPath:error:根据指定路径移动文件或目录。
      1 NSFileManager *fm = [NSFileManager defaultManager];
      2 NSString *path = @"/Users/hanlulu/Desktop/hehe/haha/abc.txt";
      3 NSString *toPath = @"/Users/hanlulu/Desktop/hehe/abc.txt";
      4 [fm moveItemAtPath:path toPath:toPath error:nil];
    • contentsOfDirectoryAtPath:error:获取指定目录下所有文件和子目录。对子目录不会进行递归枚举。
      1 NSFileManager *fm = [NSFileManager defaultManager];
      2 NSString *path = @"/Users/hanlulu/Desktop";
      3 NSArray *array = [fm contentsOfDirectoryAtPath:path error:nil];
      4 for (NSString *item in array) {
      5     NSLog(@"%@", item);
      6 }
    • enumeratorAtPath:获取指定目录下所有文件和子目录的枚举器(NSDirectoryEnumerator对象),如果目下存在子目录,则进行递归枚举子目录的所有内容,也可调用NSDirectoryEnumerator对象的skipDescendants方法阻止递归枚举。
      1 NSFileManager *fm = [NSFileManager defaultManager];
      2 NSString *path = @"/Users/hanlulu/Desktop/hehe";
      3 NSDirectoryEnumerator *dirEnum = [fm enumeratorAtPath:path];
      4 NSString *file = nil;
      5 while (file = [dirEnum nextObject]) {
      6     NSLog(@"%@", file);
      7 }
    • subpathsOfDirectoryAtPath:error:以递归的的方式获取指定目录下的所有目录以及子目录。
    • subpathAtPath:此方法和上面方法类似。
      1 NSFileManager *fm = [NSFileManager defaultManager];
      2 NSString *path = @"/Users/hanlulu/Desktop/hehe";
      3 NSArray *array = [fm subpathsAtPath:path];
      4 for (NSString *item in array) {
      5     NSLog(@"%@", item);
      6 }

    三、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(二)

  • 相关阅读:
    Redis QPS测试
    go语言下载及安装
    企业级Docker镜像仓库Harbor部署与使用
    Linux格式化数据盘
    【一周一Q】如何快速复制有规律内容
    聊一聊职业能力之执行力
    面试那些事
    使用gitlab时候 fork仓库不会实时从主仓库更新解决方案
    从给定字符串中提取姓名
    测试Websocket建立通信,使用protobuf格式交换数据
  • 原文地址:https://www.cnblogs.com/hankkk/p/5726488.html
Copyright © 2020-2023  润新知