iOS的相对路径和绝对路径

iOS程序有固定的文件访问限制,只能在自己的沙盒内。

UIImage *img=[UIImage imageNamed:@"cellicon.png"];

这段代码从相对路径加载了一个png图片资源作为UIImage对象,没有任何问题。因为它在内部已经偷偷得帮你把路径转化为相对路径了,你还不知道吧!

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

NSFileHandle
*fileHandle=[NSFileHandlefileHandleForReadingAtPath:newPath];

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

NSFileHandle
*fileHandle=[NSFileHandlefileHandleForReadingAtPath:@"test.txt"];

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

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

方法1:

NSString
*newPath=[NSStringstringWithFormat:@"%@%@%@",[[NSBundlemainBundle]resourcePath],@"/",path];

NSLog(@"url=%@",newPath);

NSFileHandle *fileHandle=[NSFileHandle
fileHandleForReadingAtPath:newPath];

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

控制台输出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”是错误的,加载文件会失败。

//
获取程序Documents目录路径
NSArray
*paths
=
NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,
YES);
NSString *documentsDirectory
=
[paths objectAtIndex:0];

//
获取程序app文件所在目录路径
NSHomeDirectory();

// 获取程序tmp目录路径
NSTemporaryDirectory();

// 获取程序应用包路径
[[NSBundle
mainBundle] resourcePath];

[[NSBundle
mainBundle] pathForResource: @"info"
ofType: @"txt"];

复制代码

初学iOS开发的同学,不管是自己写的,还是粘贴的代码,或多或少都写过下面的代码

[[NSBundle
mainBundle]
pathForResource:@"someFileName"
ofType:@"yourFileExtension"];

[YourViewController
initWithNibName:"YourViewController"
bundle:nil];

可是你知道这里的bundle到底是个啥玩意呢?!

Bundle简单地讲,就是一个内部结构按照标准规则组织的特殊目录

iOS的应用都是通过bundle进行封装的,对应的bundle类型是Application类型,平时我们通过XCode编译出来的
Target(即我们开发的应用),其实就是一个Application类型bundle,即一个文件夹!但是Finder会把这个bundle当做一个
文件显示给我们,其实是因为这个bundle自身也是一个package,而Mac系统会把所有的package当做一个文件来对待,显示给用户,从而防
止用户误操作导致程序文件损坏或丢失。至于bundle和package有什么区别,就不在这里展开说明了,本文后面所说的bundle都会被Mac系统
视为package。

现在我们已经知道了,原来我们开发的应用程序,最后都会成为一个bundle,那么就不难理解为什么很多资源文件加载大多是通过bundle来进行的了,从bundle进行文件加载实际就是通过应用自己所在的文件夹进行加载。

不过紧接着我们又会产生好几个疑问:

1 为什么不直接使用文件路径的方式来读取资源文件呢?

2 为什么还会存在pathForResource:ofType:这个方法,难道说我们在开发的时候还不能确定这些文件在哪儿吗?

事实上,我们是可以使用文件系统的路径进行资源文件的访问的,不过当我们要进行App的国际化的时候,我们需要自己去实现不同语言、地区情况下加载对应的文件,而在部分资源文件公用,部分需要国际化的时候,对开发人员来讲,代码维护起来尤为混乱。

而bundle对iOS开发者来讲,最大的方便就是可以非常简单地让自己的应用国际化,在不同的语言不同的地区,加载不同的资源文件,显示不同的语
言文字,而实现这些只需要我们严格按照bundle的要求进行资源文件的存放即可,而不需要写大量代码判断地区语言。遵循的方法也很简单,只需要我们创建
对应的"本地化文件夹"即可,例如我们要同时让图片"pic.png"在中文和英文下显示不同的内容,只需要创建两个本地化文件夹zh.lproj和
en.lproj,分别放入同名但内容不同的"pic.png"即可。

iOS的相对路径和绝对路径,布布扣,bubuko.com

时间: 2024-12-22 03:07:48

iOS的相对路径和绝对路径的相关文章

iOS开发之获取沙盒路径

iOS开发之沙盒机制(SandBox)具体解说了沙盒的一些机制.在开发中,我们须要对沙盒进行操作.所以我们须要获取到沙盒路径. 沙盒里的目录包含Documents.Library.tmp.这三个目录的作用请点击这里.接下来我们来解说怎样获取Documents.Library.tmp的路径. 获取沙盒根文件夹 获取沙盒根文件夹.直接调用NSHomeDirectory(): //获取沙盒根文件夹 NSString *directory = NSHomeDirectory(); NSLog(@"dir

iOS获取应用当前Caches目录路径以及当前日期

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); NSString *path = [[paths objectAtIndex:0] stringByAppendingString:@"/hi.dat"]; [[NSFileManager defaultManager] createFileAtPath:path contents:NULL at

iOS开发时使用的bundle路径

bundle是一个目录,其中包含了程序会使用到的资源. 这些资源包含了如图像,声音,编译好的代码,nib文件(用户也会把bundle称为plug-in). 对应bundle,cocoa提供了类NSBundle.我们的程序是一个bundle. 在Finder中,一个应用程序看上去和其他文件没有什么区别. 但是实际上它是一个包含了nib文件,编译代码,以及其他资源的目录. 我们把这个目录叫做程序的main bundle. 通过使用下面的方法得到程序的main bundleNSBundle *myBu

iOS高德地图使用-搜索,路径规划

项目中想加入地图功能,使用高德地图第三方,想要实现确定一个位置,搜索路线并且显示的方法.耗了一番功夫,总算实现了. 效果 WeChat_1462507820.jpeg 一.配置工作 1.申请key 访问 http://lbs.amap.com/dev/key/ 在高度地图第三方开发平台申请一个key,注册账户,新建应用,这个没什么门槛.得到这个key 屏幕快照 2016-05-06 上午10.34.15.png 提示一下,这个key对应的bundle ID 要和工程里面的bundle ID 相同

eclipse部署tomcat修改项目访问路径(虚拟路径)

原文参考: http://www.educity.cn/wenda/147993.html http://blog.163.com/java_zf/blog/static/19926038420129240314546/ tomcat部署web项目(eclipse自动部署项目到tomcat,访问URL中不包含部署名) 最近项目中需要把项目部署到tomcat中,并且访问路径中不包含不署名,且想实现Eclipse中的自动部署,扒了好久资料,最终实现了自己的需求,呵呵,如下: 1. 把项目contex

绝对路径和相对路径

HTML初学者会经常遇到这样一个问题,如何正确引用一个文件. 比如,怎样在一个HTML网页中引用另外一个HTML网页作为超链接(hyperlink)?怎样在一个网页中插入一张图片? 如果你在引用文件时(如加入超链接,或者插入图片等),使用了错误的文件路径,就会导致引用失效(无法浏览链接文件,或无法显示插入的图片等). 为了避免这些错误,正确地引用文件,我们需要学习一下HTML路径. 在我们平时使用计算机时要找到需要的文件就必须知道文件的位置,而表示文件的位置的方式就是路径 1.绝对路径:是从盘符

网站中图片的相对路径与绝对路径

1.相对路径 网站中加载图片所用到的相对路径,相对路径是以网页所在位置为参考的. ../代表上一级目录 src="../../photo/1.png"; src="images/1.jpg"; 2.绝对路径

浅谈 qmake 之 shadow build(就是将源码路径和构建路径分开)

shadow build shadow build 是什么东西?就是将源码路径和构建路径分开(也就是生成的makefile文件和其他产物都不放到源码路径),以此来保证源码路径的清洁. 这不是qmake独创的东西,cmake中早就使用这个东西了   cmake qmake 备注 in-source cmake . qmake project.pro 在源码路径下执行 out-of-source(shadow-build) mkdir build cd buildcmake ../project m

[原创]java WEB学习笔记35:java WEB 中关于绝对路径 和相对路径问题

本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 ---------------------------------