Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Appending to the end of a file with NSMutableString

I have a log file that I'm trying to append data to the end of. I have an NSMutableString textToWrite variable, and I am doing the following:

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

However, when I do this all the text inside the file is replaced with the text in textToWrite. How can I instead append to the end of the file? (Or even better, how can I append to the end of the file on a new line?)

like image 487
Julian Coltea Avatar asked Jun 19 '12 17:06

Julian Coltea


People also ask

What is the way to append a string to a file?

In Java, we can append a string in an existing file using FileWriter which has an option to open a file in append mode. Java FileWriter class is used to write character-oriented data to a file. It is a character-oriented class that is used for file handling in Java.

What does it mean to append to a file?

Appending a File refers to a process that involves adding new data elements to an existing database. An example of a common file append (or data append) would be the enhancement of a company's customer files.


2 Answers

I guess you could do a couple of things:

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

Note that this will append NSData to your file -- NOT an NSString. Note that if you use NSFileHandle, you must make sure that the file exists before hand. fileHandleForWritingAtPath will return nil if no file exists at the path. See the NSFileHandle class reference.

Or you could do:

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

I believe the first approach would be the most efficient, since the second approach involves reading the contents of the file into an NSString before writing the new contents to the file. But, if you do not want your file to contain NSData and prefer to keep it text, the second option will be more suitable for you.

[Update] Since stringWithContentsOfFile is deprecated you can modify second approach:

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

like image 106
Michael Frederick Avatar answered Oct 10 '22 12:10

Michael Frederick


Initially I thought that using the FileHandler method in the accepted answer that I was going to get a bunch of hex data values written to my file, but I got readable text which is all I need. So based off the accepted answer, this is what I came up with:

-(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:NSUTF8StringEncoding                        error:nil];     } } 

This way if the file doesn't yet exist, you create it. If it already exists then you only append to it. Also, if you go into the plist and add a key under the information property list UIFileSharingEnabled and set the value to true then the user can sync with their computer and see the log file through iTunes.

like image 24
Chase Roberts Avatar answered Oct 10 '22 12:10

Chase Roberts