IOS相对路径

转载链接:http://blog.youkuaiyun.com/niitlcj/article/details/7437709
在写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 mainBundlepathForResource:@"sortednames" ofType:@"plist"];

NSDictionary *dict = [[NSDictionary allocinitWithContentsOfFile:path];

 

 

例如:
<span class="pln">    </span><span class="com" style="color: rgb(136, 0, 0);">// get an image from the main app bundle</span>
<span class="pln">    </span><span class="typ" style="color: rgb(102, 0, 102);">NSBundle</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">*</span><span class="pln">appBundle </span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">[</span><span class="typ" style="color: rgb(102, 0, 102);">NSBundle</span><span class="pln"> mainBundle</span><span class="pun" style="color: rgb(102, 102, 0);">];</span>
<span class="pln">    </span><span class="typ" style="color: rgb(102, 0, 102);">NSString</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">*</span><span class="pln">path </span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">[</span><span class="pln">appBundle pathForResource</span><span class="pun" style="color: rgb(102, 102, 0);">:@</span><span class="str" style="color: rgb(0, 136, 0);">"myImage"</span><span class="pln"> ofType</span><span class="pun" style="color: rgb(102, 102, 0);">:@</span><span class="str" style="color: rgb(0, 136, 0);">"png"</span><span class="pun" style="color: rgb(102, 102, 0);">];</span>
<span class="pln">    </span><span class="typ" style="color: rgb(102, 0, 102);">UIImage</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">*</span><span class="pln">image </span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">[[</span><span class="typ" style="color: rgb(102, 0, 102);">UIImage</span><span class="pln"> alloc</span><span class="pun" style="color: rgb(102, 102, 0);">]</span><span class="pln">initWithContentsOfFile</span><span class="pun" style="color: rgb(102, 102, 0);">:</span><span class="pln">path</span><span class="pun" style="color: rgb(102, 102, 0);">];</span>
<span style="color: rgb(102, 102, 0);">经过测试,创建工程自带的plist文件是无法获取其路径的。</span>
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”是错误的,加载文件会失败

### C++ 中使用 `ofstream` 和相对路径写入文件 在 C++ 中,通过 `ofstream` 对象可以方便地实现向文件中写入数据的功能。当涉及到相对路径时,程序会基于当前工作目录解析该路径。 #### 包含必要的头文件 为了使用文件流功能,必须包含 `<fstream>` 头文件[^2]: ```cpp #include <fstream> using namespace std; ``` #### 创建并初始化 `ofstream` 实例 创建一个 `ofstream` 类型的对象,并指定要操作的目标文件名作为参数传给构造函数。如果提供的是相对路径,则此路径应相对于运行可执行文件位置而言。 例如,在项目根目录下有一个子文件夹叫作 `data`,里面想要创建或覆盖名为 `testfile.txt` 的文本文件,那么代码如下所示: ```cpp ofstream outFile("./data/testfile.txt"); if (!outFile) { cerr << "无法打开文件!" << endl; } ``` 这里需要注意两点: - 如果指定了不存在的父级目录(如上面例子中的 `./data/`),则不会自动创建这些中间层的文件夹;因此建议提前确保目标路径的有效性。 - 可以利用条件语句检测文件是否成功被打开,这有助于及时发现潜在错误[^5]。 #### 设置不同的打开模式 除了简单的读取 (`ios::in`) 或者写入 (`ios::out`) 文件外,还可以设置其他标志位来控制具体行为,比如追加内容而不是替换现有内容(`ios::app`),或者以二进制形式处理而非默认的文字编码(`ios::binary`)等。多个选项之间可以通过按位逻辑或运算符(|)连接起来共同作用于同一个文件上[^3]。 下面是一个带有附加属性的例子,它会在每次调用时都尝试把新信息添加到已有文件末尾而不破坏原有内容: ```cpp ofstream appendFile("log.txt", ios::out | ios::app); appendFile << "这是新增的一行日志。\n"; appendFile.close(); ``` #### 关闭文件 完成所有的 I/O 操作之后应当显式地关闭文件,从而释放资源并保存更改。通常情况下可以直接调用成员方法 `close()` 来做到这一点。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值