2012-10-03 21 views
6

C kütüphanem var Bir özelliği eklemek ve iOS üzerinde düzgün çalışmasını sağlamak için mümkün olduğunca az değişiklik yapıyorum. IOS 5.1'de gayet iyi çalışıyor, ancak küçük bir geçici dosya yazmak gerektiğinden iOS 6'yı kırıyor ve bence yazdığı yerde (/tmp/some.file) bir sorun var.CoreFoundation'taki NSHomeDirectory() eşdeğeri nedir?

NSHomeDirectory() ürününün objectC'den sanal alan kökü vereceğini biliyorum, ancak bunun için objectC/Foundation'ın çalıştırılmasını gerektirir. Sandbox root'unu yalnızca C/CoreFoundation çağrılarını kullanarak nasıl edinebilirim?

+0

Eğer erişiminiz var mı NSSearchPathForDirectoriesInDomains' için? Yoksa aynı sorunu var mı? – Rob

+0

Ev dizinini mi arıyorsunuz yoksa sadece bir dosyayı saklamak için geçici bir dizin mi arıyorsunuz? –

+0

@Rob A NS öneki, Foundation'ı ifade eder. – Macmade

cevap

8

NSHomeDirectory() arasında CoreFoundation eşdeğer CFCopyHomeDirectoryURL() olup. IOS 5'ten beri kullanılabilir ve “belgelenmiş” olduğu tek yer iOS 4.3 to iOS 5.0 API Differences. Eğer tmp dize hardcoding olmadan geçici dizini istiyorsanız İşlevin çağrı başarısız olursa

, o zaman TMPDIR ortam değişkeni _CS_DARWIN_USER_TEMP_DIR sabiti ile confstr kullanmak ve son çare olarak isteyebilirsiniz:

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

Doğrulamak için biraz zaman harcadık ama bu bir cevabın biraz daha hassas bir görünümü gibi görünüyor (aslında, iki cevap aslında - ama ilk olarak bahsettiğim şey), bu yüzden Seçilmiş Yanıtı buna değiştiriyorum. Anlatabildiğim kadar doğrular.yerine n> = sizeof (TMPDIR) ait – codehearted

+1

kullanımı n> sizeof (TMPDIR) –

+0

Muhtemelen 'İşlevin()' başarısız olur ve '$ TMPDIR' ayarlı değil bu durumda nihai yedek özelliğini için'/tmp' eklemek gerekir. Bu tamamen başarısız olmaktan daha iyidir. – Mecki

5

iOS'ta "ana sayfa" dizin yok.

Uygulamanız bir sanal alanda olduğundan, /tmp erişiminiz yok.

Bunun yerine, uygulamanızın sanal alanında bir tmp dizininiz var.

Uygulamanızın yolunu bulmak için CFBundle'u kullanabilirsiniz.
Temp klasörü daha sonra ../tmp/ ekleyerek bulunabilir. Temel olarak

:

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

Bu sadece istediğim gibi görünüyor, teşekkürler - Bir kez denediğimde nasıl çalıştığını size bildiririm. – codehearted

+0

Hala yazma konusunda problem yaşıyorum (fprintf üzerinde kötü bir erişim elde etmek), ancak yukarıdaki kod sanal alan içinde doğru bir yer alıyor gibi görünüyor, bu yüzden doğru olarak işaretliyorum. Tekrar teşekkürler. – codehearted

İlgili konular