Anexando al final de un file con NSMutableString

Tengo un file de logging que bash agregar datos al final de. Tengo una variable NSMutableString textToWrite , y estoy haciendo lo siguiente:

 [textToWrite writeToFile:filepath atomically:YES encoding: NSUnicodeStringEncoding error:&err]; 

Sin embargo, cuando hago esto, todo el text dentro del file se reemplaza por el text en textToWrite. ¿Cómo puedo agregar al final del file? (O incluso mejor, ¿cómo puedo anexar al final del file en una nueva línea?)

Creo que puedes hacer un par de cosas:

 NSFileHandle *fileHandle = [NSFileHandle fileHandleForWritingAtPath:aPath]; [fileHandle seekToEndOfFile]; [fileHandle writeData:[textToWrite dataUsingEncoding:NSUTF8StringEncoding]]; [fileHandle closeFile]; 

Tenga en count que esto agregará NSData a su file, NO es un NSString. Tenga en count que si usa NSFileHandle, debe asegurarse de que el file exista antes. fileHandleForWritingAtPath devolverá nil si no existe ningún file en la ruta. Consulte la reference de la class NSFileHandle .

O puede hacer:

 NSString *contents = [NSString stringWithContentsOfFile:filepath]; contents = [contents stringByAppendingString:textToWrite]; [contents writeToFile:filepath atomically:YES encoding: NSUnicodeStringEncoding error:&err]; 

Creo que el primer enfoque sería el más eficiente, ya que el segundo enfoque implica leer el contenido del file en un NSString antes de escribir los nuevos contenidos en el file. Pero, si no desea que su file contenga NSData y prefiera mantenerlo en text, la segunda opción será más adecuada para usted.

[Actualización] Dado que stringWithContentsOfFile está en desuso , puedes modificar el segundo enfoque:

 NSError* error = nil; NSString* contents = [NSString stringWithContentsOfFile:filepath encoding:NSUTF8StringEncoding error:&error]; if(error) { // If error object was instantiated, handle it. NSLog(@"ERROR while loading from file: %@", error); // … } [contents writeToFile:filepath atomically:YES encoding:NSUnicodeStringEncoding error:&err]; 

Ver pregunta sobre stackoverflow

Inicialmente pensé que al utilizar el método FileHandler en la respuesta aceptada, iba a get un montón de valores de datos hexadecimales escritos en mi file, pero obtuve un text legible que es todo lo que necesito. Entonces, basado en la respuesta aceptada, esto es lo que se me ocurrió:

 -(void) writeToLogFile:(NSString*)content{ content = [NSString stringWithFormat:@"%@\n",content]; //get the documents directory: NSString *documentsDirectory = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]; NSString *fileName = [documentsDirectory stringByAppendingPathComponent:@"hydraLog.txt"]; NSFileHandle *fileHandle = [NSFileHandle fileHandleForWritingAtPath:fileName]; if (fileHandle){ [fileHandle seekToEndOfFile]; [fileHandle writeData:[content dataUsingEncoding:NSUTF8StringEncoding]]; [fileHandle closeFile]; } else{ [content writeToFile:fileName atomically:NO encoding:NSStringEncodingConversionAllowLossy error:nil]; } } 

De esta forma, si el file aún no existe, lo crea. Si ya existe, solo lo anexas. Además, si ingresa en el plist y agrega una key debajo de la list de properties de información UIFileSharingEnabled y establece el valor en true, el usuario puede sincronizar con su computadora y ver el file de logging a través de iTunes.

Y aquí hay una versión Swift (ligeramente adoptada) de la solución de Chase Roberts :

 static func writeToFile(content: String, fileName: String = "log.txt") { let contentWithNewLine = content+"\n" let filePath = NSHomeDirectory() + "/Documents/" + fileName let fileHandle = NSFileHandle(forWritingAtPath: filePath) if (fileHandle != nil) { fileHandle?.seekToEndOfFile() fileHandle?.writeData(contentWithNewLine.dataUsingEncoding(NSUTF8StringEncoding)!) } else { do { try contentWithNewLine.writeToFile(filePath, atomically: true, encoding: NSUTF8StringEncoding) } catch { print("Error while creating \(filePath)") } } }