2012-10-03 135 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

相關問題