Anexando al final de un archivo con NSMutableString

Tengo un archivo de registro al que bash agregar datos hasta el 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 texto dentro del archivo se reemplaza con el texto en textToWrite. ¿Cómo puedo agregar al final del archivo? (O mejor aún, ¿cómo puedo agregar al final del archivo una nueva línea?)

Supongo que podrías hacer un par de cosas:

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

Tenga en cuenta que esto agregará NSData a su archivo, NO un NSString. Tenga en cuenta que si usa NSFileHandle, debe asegurarse de que el archivo exista previamente. fileHandleForWritingAtPath devolverá nil si no existe ningún archivo en la ruta. Ver la referencia de clase NSFileHandle .

O podrías 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 los contenidos del archivo en un NSString antes de escribir los nuevos contenidos en el archivo. Pero, si no desea que su archivo contenga NSData y prefiere mantenerlo en el texto, 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 usar el método FileHandler en la respuesta aceptada, iba a obtener un montón de valores hexadecimales escritos en mi archivo, pero obtuve un texto 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 archivo aún no existe, lo crea. Si ya existe, solo lo anexará. Además, si ingresa a la lista y agrega una clave en la lista de propiedades de información UIFileSharingEnabled y establece el valor en verdadero, el usuario puede sincronizar con su computadora y ver el archivo de registro 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)") } } } 
    Intereting Posts