2012-02-16 13 views
62

En un punto de mi código fileExistsAtPath: devuelve NO para los archivos que he confirmado que existen. Me he estado rascando la cabeza por esto y no puedo entender por qué no está funcionando, así que lo cambié a este código ya que este directorio existe absolutamente, pero si no se crea de todos modos.fileExistsAtPath: devuelve NO para los archivos que existen

NSError* err = nil; 
NSURL *dir = [[NSFileManager defaultManager] URLForDirectory:NSApplicationSupportDirectory 
                 inDomain:NSUserDomainMask 
               appropriateForURL:nil 
                 create: YES 
                  error:&err]; 
BOOL exists = [[NSFileManager defaultManager] fileExistsAtPath:[dir absoluteString]]; 

Después de ejecutar este código existe la carpeta del directorio de la aplicación y err es 0, pero existe es NO.

¿Cómo puede ser esto?

TIA

+0

Tampoco está comprobando si el método URLForDirectory ... devuelve nil. – bneely

+0

Además, la documentación no indica si la acción de creación es síncrona o asincrónica, pero intente mantener un retraso de unos segundos antes de su archivoExistsAtPath: llame y vea si el resultado cambia. – bneely

+0

Err es nulo como mencioné. También dir se está completando correctamente con la ruta del directorio (si lo hago en la consola o NSLog it, sus contenidos están configurados correctamente). El directorio ya existe de todos modos antes de llamar a este código: si ejecuto la aplicación dos veces, por ejemplo, sigo teniendo que el BOOL existente se establece en 0. – Gruntcakes

Respuesta

129

Debe utilizar [dir path], no [dir absoluteString].

+4

¿Puede observar por favor cuál es la diferencia de mf que me hizo perder una hora o más depurando mi código? – Mazyod

+10

ruta devuelve una ruta regular. absoluteString devuelve un archivo: /// url como una cadena. '(lldb) print fileURL.path (¡Cadena!) $ R0 ="/Users/joshwisenbaker/Library/Developer/CoreSimulator/Devices/4ED0C33D-A9AB-49EF-9AD3-13396E7C3CCA/data/Containers/Shared/AppGroup/D2180E2E- A409-430E-AC47-C71353547417/jobs.plist " (lldb) print fileURL.absoluteString (String!) $ R1 =" file: /// Users/joshwisenbaker/Library/Developer/CoreSimulator/Devices/4ED0C33D-A9AB- 49EF-9AD3-13396E7C3CCA/data/Containers/Shared/AppGroup/D2180E2E-A409-430E-AC47-C71353547417/jobs.plist "' – macshome

+0

Estoy usando ruta, aún así me devuelve falsa cada vez –

1

Hay una distinción entre ruta y url. Una ruta en representación unix es la ubicación donde existe su archivo o directorio particular. Al igual que "/Users/username/Desktop/myfile.txt"

Wheres una URL no sólo contiene la ubicación, pero esquema así, por ejemplo: http: // o https: // y en nuestro caso una dirección de fichero (file:///Users/username/Desktop/myfile.txt)

Métodos como fileExistsAtPath o removeItemAtPath necesita en ruta el parámetro en lugar de una url.

Mientras que métodos como copyItemAtURL:toURL:error:(NSError * _Nullable *)error esperan una url.

Use path atributo de NSURL objeto para recuperar la ruta. absoluteString le muestra el camino junto con el esquema.

4

Me golpeé la cabeza contra la pared durante unas horas. Aparentemente, en cada ejecución de xcode, la ruta del directorio de la aplicación estaba cambiando. El UUID parte de eso. Así que en lugar de almacenar la ruta completa que terminó la persistencia de la ruta de sufijo y anteponiendo que con cualquier clase de almacenamiento que está implícito: temporal, en caché o documentos: - [

Cuestiones relacionadas