cocoa-touch nsfilehandle

cocoa touch - NSFileHandle fileHandleForWritingAtPath: return null!



cocoa-touch (2)

mi aplicación para iPad tiene una función de descarga pequeña, para la cual deseo agregar los datos usando un NSFileHandle. El problema es que la llamada de creación solo devuelve identificadores de archivos nulos. ¿Cual podría ser el problema? Aquí están las tres líneas de código que se supone que crean mi identificador de archivo:

NSString *applicationDocumentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; self.finalPath = [applicationDocumentsDirectory stringByAppendingPathComponent: self.fileName]; NSFileHandle *output = [NSFileHandle fileHandleForWritingAtPath:self.finalPath];

Revisé la ruta del archivo y no pude ver nada malo.

TYIA


fileHandleForWritingAtPath no es una llamada de "creación". La documentación establece explícitamente: "Valor devuelto: el identificador de archivo inicializado, o nulo si no existe ningún archivo en la ruta " (énfasis agregado). Si deseas crear el archivo si no existe, deberías usar algo como esto:

NSFileHandle *output = [NSFileHandle fileHandleForWritingAtPath:self.finalPath]; if(output == nil) { [[NSFileManager defaultManager] createFileAtPath:self.finalPath contents:nil attributes:nil]; output = [NSFileHandle fileHandleForWritingAtPath:self.finalPath]; }

Si desea agregar al archivo si ya existe, use algo como [output seekToEndOfFile] . Su código completo se verá así:

NSString *applicationDocumentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; self.finalPath = [applicationDocumentsDirectory stringByAppendingPathComponent: self.fileName]; NSFileHandle *output = [NSFileHandle fileHandleForWritingAtPath:self.finalPath]; if(output == nil) { [[NSFileManager defaultManager] createFileAtPath:self.finalPath contents:nil attributes:nil]; output = [NSFileHandle fileHandleForWritingAtPath:self.finalPath]; } else { [output seekToEndOfFile]; }


Obtener la ruta del directorio de documentos

+(NSURL *)getDocumentsDirectoryPath { return [[[NSFileManager defaultManager]URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask]lastObject]; }

Guardar texto al final del archivo

si el archivo no existe, créelo y escriba datos

+(void)saveText:(NSString *)textTobeSaved atPath:(NSString*)fileName { NSString *filePath = [NSString stringWithFormat:@"%@.text",fileName]; NSString *path = [[self getDocumentsDirectoryPath].path stringByAppendingPathComponent:filePath]; NSFileHandle *fileHandler = [NSFileHandle fileHandleForWritingAtPath:path]; if(fileHandler == nil) { [[NSFileManager defaultManager] createFileAtPath:path contents:nil attributes:nil]; fileHandler = [NSFileHandle fileHandleForWritingAtPath:path]; } else { textTobeSaved = [NSString stringWithFormat:@"/n-----------------------/n %@",textTobeSaved]; [fileHandler seekToEndOfFile]; } [fileHandler writeData:[textTobeSaved dataUsingEncoding:NSUTF8StringEncoding]]; [fileHandler closeFile]; }

obtener texto del archivo con el nombre de archivo especificado

+(NSString *)getTextFromFilePath:(NSString *)fileName { NSString *filePath = [NSString stringWithFormat:@"%@.text",fileName]; NSString *path = [[self getDocumentsDirectoryPath].path stringByAppendingPathComponent:filePath]; NSLog(@"%@",path); if(path!=nil) { NSString *savedString = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil]; return savedString; }else{ return @""; } }

Borrar archivo

+(void)deleteFile:(NSString *)fileName { NSString *filePath = [NSString stringWithFormat:@"%@.text",fileName]; NSString *path = [[self getDocumentsDirectoryPath].path stringByAppendingPathComponent:filePath]; NSFileHandle *fileHandler = [NSFileHandle fileHandleForWritingAtPath:path]; if(fileHandler != nil) { [[NSFileManager defaultManager]removeItemAtPath:path error:nil]; } }