(转载保存)iOS开发中不要使用相对路径
2016-11-14 13:50
288 查看
在写iOS应用的时候遇到一个问题,使用[NSData dataWithContentOfFile:@"foo"]的时候,总是无法读取正确的文件内容。而使用[NSData dataWithContentOfFile:[[NSBundle mainBundle] pathForResource:@”foo” ofType:@”"]的时候就可以。
经过Google以后知道。当使用相对路径的时候,其实他相对的当前目录并不是程序运行的目录,而是“/”。只有使用[NSBundle mainBundle]来生成的路径才是文件真正的路径。
在此记录一下:在以后的开发中不直接使用任何相对路径,而是使用经过计算以后的绝对路径。
NSBundle束,是一种特定的文件类型,其中的内容遵循特定的结构。
NSBundle的一个主要作用是 获取Resources文件夹中的资源。
使用主束来获取需要的资源文件:
NSBundle *bundle = [NSBundle mainBundle];
NSString *plistPath = [bundle pathForResource:@"statedictionary" ofType:@"plist"];
或者简写成一行:
NSString *path = [[NSBundle mainBundle] pathForResource:@"sortednames" ofType:@"plist"];
NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:path];
例如:
![](http://static.blog.csdn.net/images/save_snippets.png)
NSBundle束,是一种特定的文件类型,其中的内容遵循特定的结构。
NSBundle的一个主要作用是 获取Resources文件夹中的资源。
使用主束来获取需要的资源文件:
NSBundle *bundle = [NSBundle mainBundle];
NSString *plistPath = [bundle pathForResource:@"statedictionary" ofType:@"plist"];
或者简写成一行:
NSString *path = [[NSBundle mainBundle] pathForResource:@"sortednames" ofType:@"plist"];
NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:path];
iOS程序有固定的文件访问限制,只能在自己的沙盒内。
UIImage *img=[UIImage imageNamed:@"cellicon.png"];
这段代码从相对路径加载了一个png图片资源作为UIImage对象,没有任何问题。因为它在内部已经偷偷得帮你把路径转化为相对路径了,你还不知道吧!
接下来,如果要加载一些自定义格式的文件或者数据,就会出现相对路径和绝对路径的问题。比如
NSFileHandle *fileHandle=[NSFileHandlefileHandleForReadingAtPath:newPath];
newPath为一个字符串路径,这里的路径你却不能像上面那样
NSFileHandle *fileHandle=[NSFileHandle fileHandleForReadingAtPath:@"test.txt"];
这样系统是找不到文件的,因为这里需要的是文件的绝对路径,而@“test.txt”完全是无效的。
这个时候就需要NSBundle的帮忙了,这个类专门用来负责路径转化等等功能那。大家都知道iOS项目虽然在xcode下可以创建文件夹结构,但是实际上它是没有文件结构概念的,所以此时假如要加载放在项目目录下的test.txt文件,完整的代码应该是这样
方法1:
NSString *newPath=[NSStringstringWithFormat:@"%@%@%@",[[NSBundlemainBundle]resourcePath],@"/",path];
NSLog(@"url=%@",newPath);
NSFileHandle *fileHandle=[NSFileHandlefileHandleForReadingAtPath:newPath];
此处[NSBundle mainBundle]是获得NSBundle的一个单例对象,次单例对象 已经设置了默认的resourcePath,也就是你的app打包后的路径,[NSBundle mainBundle]resourcePath]就是获得这个完整的打包后的app路径,但你的test.txt文件并不在这个目录,而是在app内部,这时就需要拼接路径字符串,[NSString stringWithFormat:@"%@%@%@",[[NSBundle mainBundle]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=[NSFileHandlefileHandleForReadingAtPath:newPath];
[[NSBundle mainBundle] pathForResource:@"test" ofType:@"jat"];前面的就不再介绍了,pathForResource方法有两个参数,前面这个为文件名,后面那个ofType就是文件类型,也就是文件后缀。这里把文件名和后缀分开了,如果这是你得到的是一个完整的文件名如:@“test.txt”,那么你得自己想办法把文件名和后缀分开了。
要特别说明,此处的文件后缀是不需要“.”的,如果写成@“.jat”是错误的,加载文件会失败。
话外题:有必要介绍一下打开指定路径得方法,先打开Finder
![](http://blog.csdn.net/zi2xuan/article/details/7319210)
就是这个东西,上面菜单栏会出现Finder得相关菜单,选择“前往”->再选择这个
![](http://blog.csdn.net/zi2xuan/article/details/7319210)
在弹出得窗口中输入得到得resourcePath路径,你就能看到自己得app了,你说怎么得到?自己想去。
NSBundle束,是一种特定的文件类型,其中的内容遵循特定的结构。
NSBundle的一个主要作用是 获取Resources文件夹中的资源。
使用主束来获取需要的资源文件:
NSBundle *bundle = [NSBundle mainBundle];
NSString *plistPath = [bundle pathForResource:@"statedictionary" ofType:@"plist"];
或者简写成一行:
NSString *path = [[NSBundle mainBundle] pathForResource:@"sortednames" ofType:@"plist"];
NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:path];
经过Google以后知道。当使用相对路径的时候,其实他相对的当前目录并不是程序运行的目录,而是“/”。只有使用[NSBundle mainBundle]来生成的路径才是文件真正的路径。
在此记录一下:在以后的开发中不直接使用任何相对路径,而是使用经过计算以后的绝对路径。
NSBundle束,是一种特定的文件类型,其中的内容遵循特定的结构。
NSBundle的一个主要作用是 获取Resources文件夹中的资源。
使用主束来获取需要的资源文件:
NSBundle *bundle = [NSBundle mainBundle];
NSString *plistPath = [bundle pathForResource:@"statedictionary" ofType:@"plist"];
或者简写成一行:
NSString *path = [[NSBundle mainBundle] pathForResource:@"sortednames" ofType:@"plist"];
NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:path];
例如:
// get an image from the main app bundle NSBundle *appBundle = [NSBundle mainBundle]; NSString *path = [appBundle pathForResource:@"myImage" ofType:@"png"]; UIImage *image = [[UIImage alloc]initWithContentsOfFile:path];
![](http://static.blog.csdn.net/images/save_snippets.png)
经过测试,创建工程自带的plist文件是无法获取其路径的。
NSBundle束,是一种特定的文件类型,其中的内容遵循特定的结构。
NSBundle的一个主要作用是 获取Resources文件夹中的资源。
使用主束来获取需要的资源文件:
NSBundle *bundle = [NSBundle mainBundle];
NSString *plistPath = [bundle pathForResource:@"statedictionary" ofType:@"plist"];
或者简写成一行:
NSString *path = [[NSBundle mainBundle] pathForResource:@"sortednames" ofType:@"plist"];
NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:path];
iOS程序有固定的文件访问限制,只能在自己的沙盒内。
UIImage *img=[UIImage imageNamed:@"cellicon.png"];
这段代码从相对路径加载了一个png图片资源作为UIImage对象,没有任何问题。因为它在内部已经偷偷得帮你把路径转化为相对路径了,你还不知道吧!
接下来,如果要加载一些自定义格式的文件或者数据,就会出现相对路径和绝对路径的问题。比如
NSFileHandle *fileHandle=[NSFileHandlefileHandleForReadingAtPath:newPath];
newPath为一个字符串路径,这里的路径你却不能像上面那样
NSFileHandle *fileHandle=[NSFileHandle fileHandleForReadingAtPath:@"test.txt"];
这样系统是找不到文件的,因为这里需要的是文件的绝对路径,而@“test.txt”完全是无效的。
这个时候就需要NSBundle的帮忙了,这个类专门用来负责路径转化等等功能那。大家都知道iOS项目虽然在xcode下可以创建文件夹结构,但是实际上它是没有文件结构概念的,所以此时假如要加载放在项目目录下的test.txt文件,完整的代码应该是这样
方法1:
NSString *newPath=[NSStringstringWithFormat:@"%@%@%@",[[NSBundlemainBundle]resourcePath],@"/",path];
NSLog(@"url=%@",newPath);
NSFileHandle *fileHandle=[NSFileHandlefileHandleForReadingAtPath:newPath];
此处[NSBundle mainBundle]是获得NSBundle的一个单例对象,次单例对象 已经设置了默认的resourcePath,也就是你的app打包后的路径,[NSBundle mainBundle]resourcePath]就是获得这个完整的打包后的app路径,但你的test.txt文件并不在这个目录,而是在app内部,这时就需要拼接路径字符串,[NSString stringWithFormat:@"%@%@%@",[[NSBundle mainBundle]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=[NSFileHandlefileHandleForReadingAtPath:newPath];
[[NSBundle mainBundle] pathForResource:@"test" ofType:@"jat"];前面的就不再介绍了,pathForResource方法有两个参数,前面这个为文件名,后面那个ofType就是文件类型,也就是文件后缀。这里把文件名和后缀分开了,如果这是你得到的是一个完整的文件名如:@“test.txt”,那么你得自己想办法把文件名和后缀分开了。
要特别说明,此处的文件后缀是不需要“.”的,如果写成@“.jat”是错误的,加载文件会失败。
话外题:有必要介绍一下打开指定路径得方法,先打开Finder
就是这个东西,上面菜单栏会出现Finder得相关菜单,选择“前往”->再选择这个
在弹出得窗口中输入得到得resourcePath路径,你就能看到自己得app了,你说怎么得到?自己想去。
NSBundle束,是一种特定的文件类型,其中的内容遵循特定的结构。
NSBundle的一个主要作用是 获取Resources文件夹中的资源。
使用主束来获取需要的资源文件:
NSBundle *bundle = [NSBundle mainBundle];
NSString *plistPath = [bundle pathForResource:@"statedictionary" ofType:@"plist"];
或者简写成一行:
NSString *path = [[NSBundle mainBundle] pathForResource:@"sortednames" ofType:@"plist"];
NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:path];
相关文章推荐
- iOS开发中不要使用相对路径
- iOS开发中不要使用相对路径
- iOS开发之 pch文件的使用,以及相对路径和绝对路径的设置
- (转载保存)iOS的相对路径和绝对路径
- iOS开发UI篇—Quartz2D使用(绘图路径)
- iOS开发 -关于使用iOS沙盒路径遇到的问题
- iOS开发UI篇—Quartz2D使用(绘图路径)
- iOS开发----Xcode7升级之后插件无法使用与不小心点击Skipbundle的解决办法【转载】
- iOS开发小点之--使用Keychain保存用户名密码
- iOS开发:相对路径与相对工程名
- iOS开发UI篇—Quartz2D使用(绘图路径)
- iOS开发之pch文件创建并且设置为相对路径
- [Swift]iOS开发:使用模拟器绘制图片并保存到电脑本地
- iOS 开发 -- 使用KeyChain保存用户名、密码并实现自动登录
- iOS开发之Xcode 相对路径与绝对路径
- iOS开发 沙盒路径和使用
- iOS开发-PCH文件的相对路径配置
- iOS开发的坑-懒加载中不要使用__weak __typeof(self)wself = self
- 【转载保存】Ubuntu14.04安装pycharm用于Python开发环境部署,并且支持pycharm使用中文输入