iphone - quedan - ¿Por qué usar un NSFileManager en lugar de usar el método writeToFile: atómicamente: de NSData al crear un archivo nuevo?
donde se guardan los archivos descargados de safari en iphone (3)
Considere los siguientes dos ejemplos de código:
NSData *imgData = UIImagePNGRepresentation(imgFull);
NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"itemImg_%i.png", timestamp]]; //add our image to the path
[imgData writeToFile:fullPath atomically:YES];
y
NSData *imgData = UIImagePNGRepresentation(imgFull);
NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"itemImg_%i.png", timestamp]]; //add our image to the path
NSFileManager *fileManager = [NSFileManager defaultManager];
[fileManager createFileAtPath:fullPath contents:imgData attributes:nil];
El segundo ejemplo requiere una línea de código adicional y la inicialización de un objeto NSFileManager, mientras que el primer ejemplo simplemente hace que el objeto imgData
escriba en un archivo. Una ventaja adicional del primer ejemplo es que puede sobrescribir un archivo preexistente que tenga el mismo nombre.
Mi pregunta es: al crear nuevos archivos, en qué circunstancias desearía utilizar NSFileManager y su método createFileAtPath:contents:attributes:
:?
La ventaja del método NSFileManager
es el campo de attributes
:
Un diccionario que contiene los atributos para asociar con el nuevo archivo. Puede usar estos atributos para establecer los números de propietario y grupo, los permisos de archivo y la fecha de modificación. Para obtener una lista de claves, consulte "Claves de atributos de archivo". Si especifica cero para los atributos, el archivo se creará con un conjunto de atributos predeterminados.
Esta función es inusual para usar en iOS, pero NSFileManager
es mucho más antiguo que iOS.
Por cierto, la línea adicional que estás describiendo casi nunca aparece en código real. O ya tienes una variable fileManager
que estabas usando por otras razones, o combinas las dos líneas en una:
[[NSFileManager defaultManager] createFileAtPath:fullPath contents:imgData attributes:nil];
Y sólo uno más. Como usted nota:
Una ventaja adicional del primer ejemplo es que puede sobrescribir un archivo preexistente que tenga el mismo nombre.
Bueno, eso es una ventaja o una desventaja dependiendo de lo que quieras. Si te refieres a "crear este archivo, pero no sobrescribirlo si ya existe", entonces el método FM es mucho más conveniente. Tal vez sea un error sobrescribir un archivo existente; esto le ahorra la llamada a fileExistsAtPath:
Quizás desee crear un archivo vacío si no está allí, pero déjelo solo si está. Simple: pase [NSData data]
como valor de contents
.
Entonces, lo que es mejor depende de qué problema estás resolviendo.
Recientemente, he encontrado que writeToFile:atomically:
no encaja bien cuando la unidad prueba el código. Para que la prueba fuera cómoda, tuve que inyectar NSFileManager
en la clase y en la prueba he usado un administrador de archivos simulado para verificar el comportamiento.
Según mi conocimiento y después de leer la respuesta de Rob, la mayoría de las operaciones de archivos se pueden realizar utilizando el objeto administrador de archivos compartidos. porque cada ruta se genera solo una vez. Por lo tanto, no puede surgir una situación de anulación. Por favor corrija si estoy equivocado.