2012-10-03 32 views
6

Tengo una biblioteca C Estoy modificando, lo menos posible, para agregar una función y hacer que funcione correctamente en iOS. Está funcionando bien en iOS 5.1, pero rompiendo iOS 6 porque es necesario para escribir un pequeño archivo temporal, y creo que hay un problema con los derechos con los que solía escribir (/tmp/some.file).¿Cuál es el equivalente de NSHomeDirectory() en CoreFoundation?

Sé que NSHomeDirectory() me proporcionará la raíz de la zona de pruebas de objectiveC, pero requiere que se ejecute objectiveC/Foundation. ¿Cómo puedo obtener la raíz de la zona de pruebas solo con llamadas a C/CoreFoundation?

+0

¿Tiene acceso a 'NSSearchPathForDirectoriesInDomains'? ¿O eso tiene el mismo problema? – Rob

+0

¿Está realmente buscando el directorio de inicio, o simplemente un directorio temporal para almacenar un archivo? –

+0

@Rob Un prefijo NS implica Foundation. – Macmade

Respuesta

8

El CoreFoundation equivalente de NSHomeDirectory() es CFCopyHomeDirectoryURL(). Está disponible desde iOS 5 y el único lugar donde está "documentado" está en el iOS 4.3 to iOS 5.0 API Differences.

Si desea que el directorio temporal y sin codificar la cadena tmp, entonces es posible que desee utilizar confstr con la constante _CS_DARWIN_USER_TEMP_DIR y repliegue a la variable TMPDIR medio ambiente si falla la llamada 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

Me llevó un tiempo verificarlo, pero parece ser una respuesta un tanto más precisa (bueno, dos respuestas en realidad, pero la primera es a lo que me refiero), así que estoy cambiando la Respuesta elegida a esta. Sin embargo, todos son correctos por lo que puedo decir. – codehearted

+1

use n> sizeof (tmpdir) en lugar de n> = sizeof (tmpdir) –

+0

Probablemente debería agregar una reserva final a '/ tmp' en caso de que' confstr() 'falle y' $ TMPDIR' no esté configurado. Esto es mejor que fallar por completo. – Mecki

5

No hay un directorio de "inicio" en iOS.

Su aplicación está en una caja de arena, por lo que no tiene acceso a /tmp.

En su lugar, tiene un directorio tmp dentro de la zona de pruebas de la aplicación.

Puede usar CFBundle para obtener la ruta a su aplicación.
La carpeta temporal se puede encontrar agregando ../tmp/.

Básicamente:

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

Esto parece exactamente lo que quería, gracias. Te lo haré saber una vez que lo intente. – codehearted

+0

Todavía tengo problemas para escribir en él (obtener un acceso incorrecto en fprintf), pero el código anterior parece tener una ubicación correcta dentro de la zona de pruebas, así que lo estoy marcando como correcto. Gracias de nuevo. – codehearted

Cuestiones relacionadas