2012-09-16 13:49 iOS相对路径和绝对路径的转换

本文详细介绍了在iOS开发中如何正确处理文件路径,包括使用相对路径与绝对路径的方法,并提供了两种获取文件绝对路径的实用代码示例。

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

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


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

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

  NSFileHandle *fileHandle=[NSFileHandle fileHandleForReadingAtPath:newPath];


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

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


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

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


方法1:

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

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

  NSFileHandle *fileHandle=[NSFileHandle fileHandleForReadingAtPath: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=[NSFileHandle fileHandleForReadingAtPath:newPath];

[[NSBundle mainBundle] pathForResource:@"test" ofType:@"jat"];前面的就不再介绍了,pathForResource方法有两个参数,前面这个为文件名,后面那个ofType就是文件类型,也就是文件后缀。这里把文件名和后缀分开了,如果这是你得到的是一个完整的文件名如:@“test.txt”,那么你得自己想办法把文件名和后缀分开了。

要特别说明,此处的文件后缀是不需要“.”的,如果写成@“.jat”是错误的,加载文件会失败

`std::ifstream thumbnailSource(airawLiteInfo->thumbnailPath, std::ios::binary);` 这行代码的作用是创建一个 `std::ifstream` 类型的对象 `thumbnailSource`,用于从指定路径 `airawLiteInfo->thumbnailPath` 以二进制模式读取文件。这是 C++ 标准库中处理文件输入的常用方式。 ### 详细解释: 1. **`std::ifstream`**: - 是 `basic_ifstream<char>` 的别名,专门用于读取文件。 - 继承自 `std::istream`,支持所有输入流操作(如 `>>`, `get()`, `read()` 等)。 2. **构造函数参数说明**: ```cpp std::ifstream thumbnailSource(airawLiteInfo->thumbnailPath, std::ios::binary); ``` - 第一个参数:`airawLiteInfo->thumbnailPath` - 假设它是一个表示文件路径的字符串类型(例如 `std::string` 或 `const char*`)。 - 这个路径指向要打开的缩略图文件(可能是 `.jpg`, `.png` 或其他二进制图像数据)。 - 第二个参数:`std::ios::binary` - 指定以**二进制模式**打开文件。 - 在 Windows 平台尤其重要,避免 `\n` 被自动转换为 `\r\n`,确保原始字节流准确读取。 - 对于非文本数据(如图片、音频、序列化数据),必须使用 `binary` 模式。 3. **对象生命周期与 RAII**: - `thumbnailSource` 构造时尝试打开文件。 - 如果文件不存在或无法访问,内部状态标志位 `failbit` 会被设置(可通过 `if (!thumbnailSource)` 判断失败)。 - 析构函数会自动关闭文件,符合 RAII 原则。 4. **典型用法示例**: ```cpp if (!thumbnailSource) { std::cerr << "无法打开缩略图文件: " << airawLiteInfo->thumbnailPath << std::endl; return; } // 读取整个文件到 vector<uint8_t> thumbnailSource.seekg(0, std::ios::end); size_t size = thumbnailSource.tellg(); thumbnailSource.seekg(0, std::ios::beg); std::vector<uint8_t> buffer(size); thumbnailSource.read(reinterpret_cast<char*>(buffer.data()), size); ``` 5. **注意事项**: - 确保 `airawLiteInfo` `thumbnailPath` 成员有效且不为空。 - 推荐检查文件是否成功打开。 -路径为宽字符(Windows 常见),应使用 `std::wifstream` 或转换为窄字符串。 - 在某些平台上,路径编码需注意 UTF-8 vs ANSI / Unicode。 6. **异常处理**: 可启用异常机制: ```cpp thumbnailSource.exceptions(std::ifstream::failbit | std::ifstream::badbit); ``` 这样在打开失败或读取出错时抛出异常,便于集中处理。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值