viral trata que moto hoy cocoa osx-snow-leopard nsurl core-foundation nsfilemanager

cocoa - trata - video viral de la moto



Prueba de existencia de archivos utilizando NSURL (6)

Snow Leopard introdujo muchos métodos nuevos para usar objetos NSURL para referirse a archivos, no nombres de rutas o servicios FSRefs de Core Services.

Sin embargo, hay una tarea para la que no puedo encontrar un método basado en URL: probar si existe un archivo. Estoy buscando una versión basada en URL de - [NSFileManager fileExistsAtPath: ] . Al igual que ese método, debe devolver YES si la URL describe algo, ya sea un archivo normal, un directorio o cualquier otra cosa.

Podría intentar buscar varios valores de recursos , pero no se garantiza explícitamente que ninguno de ellos exista si el archivo no lo hace, y algunos de ellos (por ejemplo, NSURLEffectiveIconKey ) podrían ser costosos si lo hace.

Podría simplemente usar fileExistsAtPath de fileExistsAtPath: , pero si hay un método más moderno, preferiría usar eso.

¿Hay algún método o función simple en Cocoa, CF o Core Services que esté garantizado / documentado para decirme si un archivo dado (o referencia de archivo) URL se refiere a un objeto de sistema de archivos que existe?


Aquí está la respuesta de Swift 2 :

var error:NSError? let folderExists = theURL.checkResourceIsReachableAndReturnError(&error)


Debido a que NSURL puede representar más que los sistemas de archivos locales, no creo que haya un método genérico que pueda probar su existencia de manera confiable. Al menos, la fundación Cocoa no contiene esa función (hasta donde yo sé).

Si solo NSFileManager con sistemas de archivos locales, le sugiero que cree una categoría para NSURL o para NSFileManager , con un mensaje urlExists: Convertirá el NSURL en un NSString (ruta normalizada) y luego invocará el [NSFileManager fileExistsAtPath:] .


Determinar si un archivo dado (o referencia de archivo) URL se refiere a un objeto de sistema de archivos que existe es intrínsecamente costoso para recursos remotos, las api solo 10.6 (sin iPhoneOS) para este CFURLResourceIsReachable () y [NSURL checkResourceIsReachableAndReturnError:] son ​​ambas sincrónicas , incluso si los estuvieras usando, para muchos archivos aún estarías viendo un retraso significativo.

Lo que debe hacer es implementar su propia rutina de comprobación asincrónica con el almacenamiento en caché que, por separado, crea una lista de recursos válidos.

De lo contrario, las notas para CFURLResourceIsReachable en el estado del encabezado:

Un ejemplo sería el mantenimiento periódico del estado de UI que depende de la existencia de un documento en particular. Al realizar una operación como abrir un archivo, es más eficiente simplemente probar la operación y manejar fallas que verificar primero para ver si se puede acceder.


En Swift puede usar el método checkResourceIsReachable() , que desafortunadamente devolverá true (si el archivo es alcanzable) o arrojará un error (explicando por qué no se puede alcanzar).

Para obtener un valor bool verdadero / falso en su lugar, use esta sintaxis:

let exists = (try? inputFile.checkResourceIsReachable()) ?? false

Si desea registrar el error:

let exists: Bool do { exists = try inputFile.checkResourceIsReachable() } catch { exists = false print(error.localizedDescription) }

Tenga en cuenta que esta es una operación costosa y podría estar desactualizada inmediatamente después (si algún otro proceso está eliminando o desmontando un archivo de disco mientras está comprobando si existe).

En general, el enfoque preferido no es verificar si existe un archivo, sino simplemente intentar leer o escribir en un archivo y manejar cualquier error posterior si falla.


En iOS no pude encontrar de otra manera ...

NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"file.type"]; if ([[NSFileManager defaultManager] fileExistsAtPath:[storeURL path]]) {...}


NSURL tiene este método:

- (BOOL)checkResourceIsReachableAndReturnError:(NSError **)error

Que "Devuelve si se puede llegar al recurso al que apunta una URL de archivo".

NSURL *theURL = [NSURL fileURLWithPath:@"/Users/elisevanlooij/nonexistingfile.php" isDirectory:NO]; NSError *err; if ([theURL checkResourceIsReachableAndReturnError:&err] == NO) [[NSAlert alertWithError:err] runModal];