使用NSMutableString附加到文件的末尾

我有一个日志文件,我试图追加数据的结尾。 我有一个NSMutableString textToWritevariables,我正在做以下几点:

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

但是,当我这样做时,文件内的所有文本都被replace为textToWrite中的文本。 我怎样才能追加到文件的末尾? (或者甚至更好,我怎样才能追加到文件的最后一行?)

我想你可以做一些事情:

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

请注意,这将附加NSData到您的文件 – 不是一个NSString。 请注意,如果您使用NSFileHandle,则必须确保文件存在于手边。 如果path中没有文件, fileHandleForWritingAtPath将返回nil。 请参阅NSFileHandle类的引用 。

或者你可以这样做:

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

我相信第一种方法是最有效的,因为第二种方法涉及在将新内容写入文件之前将文件内容读入NSString。 但是,如果你不想让你的文件包含NSData并且更喜欢保留文本,那么第二个选项将更适合你。

[更新]由于stringWithContentsOfFile已被弃用,您可以修改第二种方法:

 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]; 

看到在stackoverflow的问题

最初我以为在接受的答案中使用FileHandler方法,我将得到一堆hex数据值写入我的文件,但我得到了可读的文本,这是我所需要的。 所以根据我接受的答案,这就是我想出来的:

 -(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]; } } 

这样,如果文件不存在,你创build它。 如果它已经存在,那么你只能附加到它。 此外,如果您进入plist并在信息属性列表UIFileSharingEnabled下添加一个键并将该值设置为true,则用户可以与其计算机同步,并通过iTunes查看日志文件。

下面是一个(稍微采用的) 大通罗伯茨解决scheme的 Swift版本:

 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)") } } } 
Interesting Posts