2012-02-27 10 views
18

Considere los siguientes dos ejemplos de código:¿Por qué utilizar un NSFileManager en lugar de usar el método writeToFile: atómicamente de NSData al crear un nuevo archivo?

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 se requiere una línea adicional de código y la inicialización de un objeto NSFileManager, mientras que el primer ejemplo simplemente tiene el objeto NSData imgData escribirse en un archivo. Una ventaja adicional del primer ejemplo es que puede sobrescribir un archivo preexistente que tiene el mismo nombre.

Mi pregunta es: cuando se crean nuevos archivos, ¿bajo qué circunstancias realmente querría usar NSFileManager y su método createFileAtPath:contents:attributes:?

+0

NSData's writeToFile no sobrescribe como predeterminado, según mi experiencia. Y tampoco lo hace el archivo createFileAtPath de NSFileManager con atributos: nil.Información sobre los atributos del método NSDictionary está próximo, lo que sugiere que no se usa con frecuencia. –

Respuesta

35

La ventaja del método es el campo NSFileManagerattributes:

un diccionario que contiene los atributos de asociar con el nuevo archivo. Puede usar estos atributos para establecer los números de propietario y grupo, permisos de archivo y fecha de modificación. Para obtener una lista de claves, consulte "Claves de atributos de archivos". Si especifica nil para los atributos, el archivo se crea con un conjunto de atributos predeterminados.

Esta característica es inusual para usar en iOS, pero NSFileManager es mucho mayor que el IOS.

Por cierto, la línea adicional que está describiendo casi nunca aparece en código real. Ya sea que usted ya tiene una variable fileManager que estaba utilizando por otras razones, o se combinan las dos líneas en una sola:

[[NSFileManager defaultManager] createFileAtPath:fullPath contents:imgData attributes:nil]; 

Y sólo uno más. Como observa:

Una ventaja adicional del primer ejemplo es que puede sobrescribir un archivo preexistente que tiene el mismo nombre.

Bueno, eso es una ventaja o una desventaja dependiendo de lo que desee. Si quiere decir "crear este archivo, pero no sobrescribirlo si ya existe", entonces el método FM es mucho más conveniente. Tal vez es un error sobrescribir un archivo existente; esto le ahorra la llamada al fileExistsAtPath:. Tal vez quiera crear un archivo vacío si no está allí, pero déjelo en paz si es así. Simple: pase [NSData data] como el valor contents.

Entonces, qué es mejor depende del problema que esté resolviendo.

+0

Excelente respuesta y gracias por tocar brevemente la razón de ser más amplia, que no pertenece a iOS, de la clase NSFileManager. – maxedison

+0

Excelente respuesta de hecho. Gracias Rob – Eugene

+0

en SandBox, cada vez es más diferente. Hope Rob puede actualizar la respuesta. ¡Gracias! –

0

según mi conocimiento y después de la respuesta de lectura por Rob, la mayoría de las operaciones de archivos se pueden realizar utilizando el objeto de administrador de archivos compartidos. porque cada ruta genera solo una vez. Por lo tanto, no puede surgir la situación de anulación. Corrija si estoy equivocado.

0

Recientemente, he encontrado que writeToFile:atomically: no encaja bien cuando la unidad prueba el código. Para que las pruebas fueran cómodas, tuve que inyectar NSFileManager en la clase y en la prueba utilicé el administrador de archivos simulado para verificar el comportamiento.

Cuestiones relacionadas