2012-10-03 136 views
6

我有一个C库,我正在修改,尽可能少地添加一个功能,并让它在iOS上正常运行。它在iOS 5.1上工作正常,但在iOS 6上打破了,因为它需要编写一个小的临时文件,而且我认为存在一个问题,它带有用于写入的权限(/tmp/some.file)。CoreFoundation中NSHomeDirectory()的等价物是什么?

我知道NSHomeDirectory()会给我来自的ObjectiveC沙箱根,但它需要的ObjectiveC /基金会运行。如何仅使用C/CoreFoundation调用来获取沙箱根目录?

+0

你有访问到'NSSearchPathForDirectoriesInDomains'?还是有同样的问题? – Rob

+0

你实际上是在寻找主目录,还是只是一个临时目录来存储文件? –

+0

@Rob NS前缀暗示基础。 – Macmade

回答

8

的等效的CoreFoundation的NSHomeDirectory()CFCopyHomeDirectoryURL()。它自iOS 5起可用,唯一“记录”的地方是iOS 4.3 to iOS 5.0 API Differences

如果你想不硬编码tmp字符串的临时目录,那么你可能需要使用confstr_CS_DARWIN_USER_TEMP_DIR不变,并退回到TMPDIR环境变量如果confstr调用失败:

char tmpdir[PATH_MAX]; 
size_t n = confstr(_CS_DARWIN_USER_TEMP_DIR, tmpdir, sizeof(tmpdir)); 
if ((n <= 0) || (n >= sizeof(tmpdir))) 
    strlcpy(tmpdir, getenv("TMPDIR"), sizeof(tmpdir)); 
CFURLRef tmp = CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault, (UInt8 *)tmpdir, strlen(tmpdir), true); 
+0

花了一段时间来验证,但这确实似乎是一个更精确的答案(嗯,实际上有两个答案 - 但第一个是我指的是),所以我将选择的答案切换到这个答案。尽管我可以说,但它们都是正确的。 – codehearted

+1

使用n> sizeof(tmpdir)代替n> = sizeof(tmpdir) –

+0

如果'confstr()'失败并且'$ TMPDIR'没有被设置,你应该在'/ tmp'中添加一个最后的回退。这比完全失败要好。 – Mecki

5

iOS上没有“home”目录。

您的应用在沙箱中,这样你就不必/tmp访问。

相反,您的应用程序沙箱中有一个tmp目录。

您可以使用CFBundle来获取您的应用的路径。
然后可以通过添加../tmp/找到临时文件夹。

基本上:

CFBundleRef   bundle; 
CFURLRef   url; 
CFStringRef   bundlePath; 
CFStringRef   tmpRelPath; 
CFMutableStringRef tmpPath; 

bundle  = CFBundleGetMainBundle(); 
url   = CFBundleCopyBundleURL(bundle); 
bundlePath = CFURLCopyFileSystemPath(url, kCFURLPOSIXPathStyle); 
tmpRelPath = CFSTR("/../tmp/"); 
tmpPath  = CFStringCreateMutable(kCFAllocatorDefault, CFStringGetLength(bundlePath) + CFStringGetLength(tmpRelPath)); 

CFStringAppend(tmpPath, bundlePath); 
CFStringAppend(tmpPath, tmpRelPath); 

CFShow(tmpPath); 

CFRelease(url); 
CFRelease(bundlePath); 
CFRelease(tmpPath); 
+0

这看起来就像我想要的,谢谢 - 一旦我尝试它,我会让你知道它是如何工作的。 – codehearted

+0

我仍然遇到问题(在fprintf上获取访问权限不佳),但上面的代码确实似乎正确地获取了沙箱内的位置,所以我将其标记为正确。再次感谢。 – codehearted

相关问题