美文网首页
NSBundle介绍以及读取沙盒文件路径问题

NSBundle介绍以及读取沙盒文件路径问题

作者: UILabelkell | 来源:发表于2017-06-19 17:19 被阅读94次

    @NSBundle包,是一种特定的文件类型,一个主要作用是 获取Resources文件夹中的资源

    bundle是一个目录,其中包含了程序会使用到的资源. 这些资源包含了如图像,声音,编译好的代码,nib文件(用户也会把bundle称为plug-in). 对应bundle,cocoa提供了类NSBundle.

    我们的程序是一个bundle. 在Finder中,一个应用程序看上去和其他文件没有什么区别. 但是实际上它是一个包含了nib文件,编译代码,以及其他资源的目录. 我们把这个目录叫做程序的main bundle。

    [NSBundle mainBundle]是获得NSBundle的一个单例对象,次单例对象 已经设置了默认的resourcePath,也就是你的app打包后的路径,[NSBundle mainBundle]resourcePath]就是获得这个完整的打包后的app路径,但你的test.txt文件并不在这个目录,而是在app内部,这时就需要拼接路径字符串[NSString stringWithFormat:@"%@%@%@",[[NSBundle mainBundle]resourcePath],@"/",path];

    iOS程序有固定的文件访问限制,只能在自己的沙盒内。
    UIImage *img=[UIImage imageNamed:@“cellicon.png”];
    这段代码从相对路径加载了一个png图片资源作为UIImage对象,没有任何问题。因为它在内部已经偷偷得帮你把路径转化为相对路径了,你还不知道吧!

    接下来,如果要加载一些自定义格式的文件或者数据,就会出现相对路径和绝对路径的问题。比如

    NSFileHandle *fileHandle=[NSFileHandlefile HandleForReadingAtPath:newPath];

    newPath为一个字符串路径,这里的路径你却不能像上面那样

    NSFileHandle *fileHandle=[NSFileHandle fileHandleForReadingAtPath:@“test.txt”];

    这样系统是找不到文件的,因为这里需要的是文件的绝对路径,而@“test.txt”完全是无效的。

    这个时候就需要NSBundle的帮忙了,这个类专门用来负责路径转化等等功能那。大家都知道ios项目虽然在xcode下可以创建文件夹结构,但是实际上它是没有文件结构概念的,所以此时假如要加载放在项目目录下的test.txt文件,完整的代码应该是这样

    方法1:

    NSString *newPath=[NSString stringWithFormat:@"%@%@%@",[[NSBundle mainBundle]resourcePath],@"/",path];

    NSLog(@“url=%@”,newPath);

    NSFileHandle *fileHandle=[NSFileHandlefile HandleForReadingAtPath:newPath];

    控制台输出app路径resourcePath:

    /Users/zouzouyanghong/Library/Application Support/iPhone Simulator/5.0/Applications/76116A6A-572D-43AE-AE78-17D7A88DCAFC/JFitnessProduct.app

    控制台输出拼接后完整文件绝对路径:

    /Users/zouzouyanghong/Library/Application Support/iPhone Simulator/5.0/Applications/76116A6A-572D-43AE-AE78-17D7A88DCAFC/JFitnessProduct.app/test.jat

    方法2:
    NSString *newPath=[[NSBundle mainBundle] pathForResource:@“test” ofType:@“txt”];
    NSFileHandle *fileHandle=[NSFileHandle fileHandleForReadingAtPath:newPath];

    [[NSBundle mainBundle] pathForResource:@“test” ofType:@“jat”];前面的就不再介绍了,pathForResource方法有两个参数,前面这个为文件名,后面那个ofType就是文件类型,也就是文件后缀。
    这里把文件名和后缀分开了,如果这是你得到的是一个完整的文件名如:@“test.txt”,那么你得自己想办法把文件名和后缀分开了。
    @要特别说明,此处的文件后缀是不需要“.”的,如果写成@“.jat”是错误的,加载文件会失败。
    (网上看到的转载,大神们有何建议来 讲讲 相互讨论一下)

    相关文章

      网友评论

          本文标题:NSBundle介绍以及读取沙盒文件路径问题

          本文链接:https://www.haomeiwen.com/subject/tifnqxtx.html