38

我有一个日志文件,我正在尝试将数据附加到末尾。我有一个NSMutableString textToWrite变量,我正在执行以下操作:

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

但是,当我这样做时,文件中的所有文本都将替换为 textToWrite 中的文本。我怎样才能追加到文件的末尾?(或者更好的是,我怎样才能将文件追加到新行的末尾?)

4

3 回答 3

65

我想你可以做几件事:

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

请注意,这会将 NSData 附加到您的文件中——而不是 NSString。请注意,如果您使用 NSFileHandle,则必须事先确保该文件存在。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 的问题

于 2012-06-19T18:02:33.830 回答
34

最初,我认为在接受的答案中使用 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:NSUTF8StringEncoding
                       error:nil];
    }
}

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

于 2013-04-16T18:50:17.263 回答
2

这是Chase Roberts 解决方案的(略微采用)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)")
        }
    }
}
于 2015-10-14T14:58:53.447 回答