• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - 在 iOS 中,在纯 C 中,这是获取本地文件路径的方法吗?

[复制链接]
菜鸟教程小白 发表于 2022-12-13 05:20:53 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我最终需要一个 cstring ... 作为包中文件的本地路径。

首先,

#include <CoreFoundation/CoreFoundation.h>

(这是纯 C 对吗?.. 你不能使用 Foundation)

然后

CFBundleRef mb = CFBundleGetMainBundle();
CFURLRef ur = CFBundleCopyResourceURL(mb, CFSTR("blah"), CFSTR("txt"), NULL);
CFStringRef imagePath = CFURLCopyFileSystemPath(ur, kCFURLPOSIXPathStyle);

CFStringEncoding encodingMethod = CFStringGetSystemEncoding();
const char *filename = CFStringGetCStringPtr(imagePath, encodingMethod);

printf( "\n we did it! .. %s \n", filename );

假设“blah.txt”在你的包中,它可以工作。

这是我知道的唯一方法 - 似乎很啰嗦。有什么关系?

  1. 我的代码是不是冗长、三色堇、可怜?

  2. 这是从文件名中获取 cstring 路径的正确和最佳习惯用法吗?

(注意我不希望将其设为 obj-c 或 obj-cpp 文件。纯 C。)



Best Answer-推荐答案


您的代码实际上不够长,并且有一些小错误:

  • 你必须CFRelease你拥有的所有对象。您可能会在其他地方执行此操作,但这从代码中并不明显。
  • CFStringGetCStringPtr 不 promise 返回值。如果字符串已经以您想要的格式在内部存储,它只会返回一个值。这可能在每个可能实际运行的系统上的代码中都是正确的,但它不是安全的 CoreFoundation 做法。
  • 同样,将 CFStringGetSystemEncoding 的结果传递给 CFStringGetCStringPtr 也是不安全的,因为后者需要 8 位编码。这不是 promise 的,但是....
  • CFStringGetSystemEncoding 几乎从不需要或不合适。您可能实际上并不想要 MacRoman(这可能是您得到的,除非您可能配置了 MacJapanese)。您可能需要 UTF8,因此您应该提出要求。

所以你会这样做:

CFBundleRef mb = CFBundleGetMainBundle();
CFURLRef ur = CFBundleCopyResourceURL(mb, CFSTR("blah"), CFSTR("txt"), NULL);
CFStringRef imagePath = CFURLCopyFileSystemPath(ur, kCFURLPOSIXPathStyle);

// Now convert to a C-string
CFStringEncoding encoding = kCFStringEncodingUTF8;
CFIndex length = CFStringGetLength(imagePath);
CFIndex maxSize = CFStringGetMaximumSizeForEncoding(length, encoding);

char *filename = (char *)malloc(maxSize + 1); // +1 for \0

// Technically this can fail, but it really, really can't.
CFStringGetCString(imagePath, filename, maxSize, encoding);

printf( "\n we did it! .. %s \n", filename );

// Cleanup
free(filename); filename = NULL;
CFRelease(imagePath); imagePath = NULL;
CFRelease(ur); ur = NULL;

您可以找到 MYStringConversion功能有帮助。 MYCFStringCopyUTF8String 为您返回一个包含 cstring 的 malloc 缓冲区(即您需要 free 它)。 (这些来自 iOS 编程的第 10 章:挑战极限。)

关于字符串缓冲区的一个侧面说明。人们经常倾向于使用基于 PATH_MAX 的缓冲区。请记住,macOS 允许名称比 PATH_MAX 长得多的路径。我不知道对 macOS 路径字符串的长度有任何硬性限制。在实践中,很少有真正的路径超过 PATH_MAX,但是当你创建一个路径时,看看有多少软件中断是有趣的(实际上并不有趣)。

请注意,通常不需要此代码。在大多数 CoreFoundation 项目中,您只需直接使用 ur,这与使用原始 cstrings 相比非常好。

关于ios - 在 iOS 中,在纯 C 中,这是获取本地文件路径的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54099589/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap