我有一个日志文件,我正在尝试将数据附加到结尾。我有一个NSMutableString
textToWrite
变量,我正在执行以下操作:
[textToWrite writeToFile:filepath atomically:YES
encoding: NSUnicodeStringEncoding error:&err];
然而,当我这样做时,文件中的所有文本都被textToWrite中的文本替换。我怎样才能附加到文件的末尾? (或者更好的是,如何在新行上追加文件的末尾?)
答案 0 :(得分:57)
我猜你可以做几件事:
NSFileHandle *fileHandle = [NSFileHandle fileHandleForWritingAtPath:aPath];
[fileHandle seekToEndOfFile];
[fileHandle writeData:[textToWrite dataUsingEncoding:NSUTF8StringEncoding]];
[fileHandle closeFile];
请注意,这会将NSData附加到您的文件 - 而不是NSString。请注意,如果使用NSFileHandle,则必须确保该文件存在。如果路径中不存在任何文件,则fileHandleForWritingAtPath
将返回nil。请参阅NSFileHandle class reference。
或者你可以这样做:
NSString *contents = [NSString stringWithContentsOfFile:filepath];
contents = [contents stringByAppendingString:textToWrite];
[contents writeToFile:filepath atomically:YES encoding: NSUnicodeStringEncoding error:&err];
我认为第一种方法效率最高,因为第二种方法是在将新内容写入文件之前将文件内容读入NSString。但是,如果您不希望您的文件包含NSData并且希望保留文本,则第二个选项将更适合您。
<强> [更新] 强> 由于stringWithContentsOfFile是deprecated,您可以修改第二种方法:
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];
答案 1 :(得分:28)
最初我认为在接受的答案中使用FileHandler方法,我将获得一堆写入我的文件的十六进制数据值,但我得到了可读的文本,这就是我所需要的。因此,基于已接受的答案,这就是我想出的:
-(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];
}
}
这样,如果文件尚不存在,则创建它。如果它已经存在,那么你只是追加它。此外,如果您进入plist并在信息属性列表UIFileSharingEnabled下添加一个键并将值设置为true,则用户可以与他们的计算机同步并通过iTunes查看日志文件。
答案 2 :(得分:1)
这是Chase Roberts' solution的一个(稍微采用)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)")
}
}
}