追加用的NSMutableString一个文件的末尾追加用的NSMutableString一个文件的

2019-06-02 12:25发布

我有我尝试将数据追加到年底的日志文件。 我有一个NSMutableString textToWrite变量,我做了以下内容:

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

然而,当我做这一切的文件中的文本替换为textToWrite文本。 我怎么能代替附加到文件末尾? (甚至更好,我怎么能追加到一个新行的文件的末尾?)

Answer 1:

我想你可以做两件事情:

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

参见问题计算器



Answer 2:

起初我以为使用公认的答案,我要得到一堆写我的文件十六进制数据值的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。



Answer 3:

这里是一个(略通过)斯威夫特版本大通罗伯茨的解决方案 :

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


文章来源: Appending to the end of a file with NSMutableString