iOS中的文件I/O

iOS应用程序只能在系统为该应用所分配的文件区域下读/写文件,这个文件区域就被称为该应用程序的沙盒。这个文件区域的文件结构如下:

  • Documents:除了基于NSUserDefaults的首选项之外,应用程序的数据、文件都保存在该目录下
  • Library:基于NSUserDefaults的首选项参数保存在Library/Preferences
  • tmp:该目录供应用程序存储临时文件,当iOS执行同步时,iTunes不会备份tmp目录下的文件。
  • appName.app:包含了应用程序本身的数据,包括资源文件和可执行文件等。程序启动以后,会根据需要从该目录中动态加载代码或资源到内存

如图所示:

获取主要目录路径的方式:(使用C语言的函数)

  • NSHomeDirectory():获取沙盒目录
  • NSTemporaryDirectory():获取tmp目录
  • [[NSBundle mainBundle] bundlePath]:获取appName.app目录
  • 获取Documents目录:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];

解释:NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory directory, NSSearchPathDomainMask domainMask, BOOL expandTilde)

  1. directory:枚举类型,表明我们要搜索的目录名称,比如这里用NSDocumentDirectory表明我们要搜索的是Documents目录。
  2. domainMask:指定搜索范围,这里的NSUserDomainMask表示搜索的范围限制于当前应用的沙盒目录(iOS一般是这个)
  3. expandTilde:BOOL值,表示是否展开波浪线~。我们知道在iOS中~的全写形式是/User/userName,该值为YES即表示写成全写形式,为NO就表示直接写成“~”

一.使用NSData与NSMutableData

NSData与NSMutableData代表Objective-C的数据缓存区。下面列出NSData的常用方法:

  • dataWithBytes:length:或者initWIthBytes:length::复制C数组所包含的数据来初始化NSData的数据。其中,如果你想完全复制C数组,length则为数组的长度。
  • getBytes:length::将NSData指定长度的数据读入数组
  • writeToFile:atomically::将NSData的数据写入文件
    NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://www.baidu.com"]];
    NSLog(@"length=%ld",[data length]);
    char buffer[100];
    //将NSData写入数组中
    [data getBytes:buffer range:NSMakeRange(103, 100)];
    NSLog(@"buffer=%s",buffer);
    //将NSData转变为NSString
    NSString *content = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    NSLog(@"%@",content);

下面的内容列表是:

  • NSFileManager:管理文件和目录(创建、删除、移动、复制)
  • NSFileHandle:读取文件目录
  • NSURL:读取网络资源
  • NSBundle:读取项目内部的资源

二.使用NSFileManager管理文件和目录

  • 访问文件属性和内容
  • 创建、删除、移动、复制
  • 查看目录包含的内容

1.访问文件属性和内容

判断指定文件名对应的文件是否存在:

NSString *home = NSHomeDirectory();//获取沙盒家目录
NSString *path = [NSString stringWithFormat:@"%@/string.js",home];
    NSFileManager *fm = [NSFileManager defaultManager];
    NSLog(@"%d",[fm fileExistsAtPath:path]);

获取指定文件名对应文件的内容:

NSString *home = NSHomeDirectory();
    NSString *path = [NSString stringWithFormat:@"%@/string.js",home];
    NSFileManager *fm = [NSFileManager defaultManager];
    NSData *data = [fm contentsAtPath:path];
    NSString *content = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    NSLog(@"content=%@",content);

2.创建、删除、移动、复制

NSString *document = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
    NSFileManager *fm = [NSFileManager defaultManager];
    //创建目录(withIntermediateDirectories为YES,表示父目录如果不存,就创建父目录)
    [fm createDirectoryAtPath:[NSString stringWithFormat:@"%@/PDF",document] withIntermediateDirectories:YES attributes:nil error:nil];

    //创建一份文件(conent类型为NSData)
    NSString *content = @"Hello,World";
    [fm createFileAtPath:[NSString stringWithFormat:@"%@/info.pdf",document] contents:[content dataUsingEncoding:NSUTF8StringEncoding] attributes:nil];

3.查看目录包含的内容

NSString *home =NSHomeDirectory();
    NSFileManager *fm = [NSFileManager defaultManager];
    //获取指定目录下的所有文件和文件夹(不会进行递归枚举)
    NSArray *array1 = [fm contentsOfDirectoryAtPath:home error:nil];
    NSLog(@"array1=%@",array1);
    //递归获取指定目录下的所有目录及其子目录
    NSArray *array2 = [fm subpathsOfDirectoryAtPath:home error:nil];
    NSLog(@"array2=%@",array2);

三.使用NSPathUtilities.h管理路径

NSPathUtilities.h包含了对NSString类的扩展,为NSString类新增了专门用于操作路径的方法。

NSString *home =  NSTemporaryDirectory();
    //在home路径后追加一个路径
    NSString *path = [home stringByAppendingPathComponent:@"abc.m"];
    //获取路径的最后部分
    NSString *last =[path lastPathComponent];
    //获取路径的最后部分的扩展名
    NSString *extension =[path pathExtension];

四.使用NSFileHandle处理文件IO

使用readDataOfLength:length:读取该文件中length字节的数据

NSString *home = NSHomeDirectory();
    NSFileHandle *fh = [NSFileHandle fileHandleForReadingAtPath:[NSString stringWithFormat:@"%@/string.js",home]];
    NSData *data;
    while ([(data = [fh readDataOfLength:512]) length] > 0) {
        NSLog(@"%ld",[data length]);
        NSString *content = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
        NSLog(@"%@",content);
    }
    [fh closeFile];

使用writeData:data::将指定数据data输入到该文件中,注意:NSFileHandle并没有提供创建文件的功能。

NSString *home = NSHomeDirectory();
    NSFileHandle *fh = [NSFileHandle fileHandleForWritingAtPath:[NSString stringWithFormat:@"%@/new.js",home]];
    if (!fh) {
        NSFileManager *fm = [NSFileManager defaultManager];
        [fm createFileAtPath:[NSString stringWithFormat:@"%@/new.js",home] contents:nil attributes:nil];
        NSLog(@"new");
        fh = [NSFileHandle fileHandleForWritingAtPath:[NSString stringWithFormat:@"%@/new.js",home]];
    }

    NSString *content = @"new Add";
    [fh writeData:[content dataUsingEncoding:NSUTF8StringEncoding]];
    [fh closeFile];

五.使用NSBundle处理项目相关资源

在iOS应用中添加资源:把文件拖到Xcode左边的项目导航面板中。当应用自包含这些资源文件后,可以使用NSBundle来访问资源文件。

//string.js必须要在Xcode左边的面板中
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"string" ofType:@"js"];
    NSString *content = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
    NSLog(@"%@",content);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值