2012-06-19 23 views
26

Tengo un archivo de registro que estoy tratando de anexar datos hasta el final de. Tengo una variable NSMutableStringtextToWrite, y yo estoy haciendo lo siguiente:Adjuntar al final de un archivo con NSMutableString

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

Sin embargo, cuando hago esto todo el texto dentro del archivo se sustituye por el texto en textToWrite. ¿Cómo puedo agregar al final del archivo? (O mejor aún, ¿cómo puedo añadir al final del archivo en una nueva línea?)

+0

supongo que 'NSLog' no va a funcionar de la manera deseada? – zneak

+0

FYI, no hay ningún método en 'NSString' /' NSMutableString' que te permita agregarlo a un archivo. Sin embargo, hay un ejemplo [aquí] (http://lists.apple.com/archives/cocoa-dev/2002/Aug/msg00754.html). – zneak

Respuesta

48

Creo que se puede hacer un par de cosas:

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

Tenga en cuenta que esto va a anexar NSData a su archivo - NO es un NSString. Tenga en cuenta que si usa NSFileHandle, debe asegurarse de que el archivo exista de antemano. fileHandleForWritingAtPath devolverá nil si no existe ningún archivo en la ruta. Vea el NSFileHandle class reference.

O usted podría 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 consiste en leer el contenido del archivo en una NSString antes de escribir los nuevos contenidos en el fichero. 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] Desde stringWithContentsOfFile es deprecated puede modificar 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]; 

See question on stackoverflow

+0

Así que hice su primera sugerencia, y mientras funciona, tengo este error realmente extraño de que todo lo que añada aparece como caracteres chinos. (aunque todos los datos que estoy escribiendo en el archivo están en inglés, y antes, cuando estaba reemplazando el texto, aparecían en inglés) –

+0

Edité mi respuesta ... está agregando NSData a su archivo, no está claro texto. Si desea mantener su archivo como texto sin formato, debe usar el segundo método. –

23

Al principio pensé que el uso del método FileHandler en la respuesta aceptada de que iba a conseguir un montón de valores de datos hexadecimales escritos en mi archivo, pero obtuve texto legible, que es todo lo que necesito. Así que según la respuesta aceptada, esto es lo que 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 manera si todavía no existe el archivo, se 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.

+0

¿Hay alguna razón por la cual al crear un archivo nuevo está utilizando una codificación diferente a la que se agrega al archivo? – huggie

+0

No, ni siquiera me di cuenta de eso. –

+1

La manera más limpia de compilar esa ruta es usar '[documentsDirectory stringByAppendingPathComponent: @" hydraLog.txt "]' –

1

Y aquí es un (ligeramente adoptado) versión de Swift Chase Roberts' solution:

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)") 
     } 
    } 
} 
Cuestiones relacionadas