gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 10:20:22 25 4
gpt4 key购买 nike

我需要以一个 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。)

最佳答案

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

  • 您必须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 缓冲区(即您需要释放它)。 (这些来自 iOS 编程的第 10 章:突破极限。)

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

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com