使用NSMutableString附加到文件的末尾

Jul*_*tea 35 file-io append objective-c nsmutablestring ios

我有一个日志文件,我试图将数据追加到最后.我有一个NSMutableString textToWrite变量,我正在做以下事情:

[textToWrite writeToFile:filepath atomically:YES 
                                    encoding: NSUnicodeStringEncoding error:&err];
Run Code Online (Sandbox Code Playgroud)

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

Mic*_*ick 59

我想你可以做几件事:

NSFileHandle *fileHandle = [NSFileHandle fileHandleForWritingAtPath:aPath];
[fileHandle seekToEndOfFile];
[fileHandle writeData:[textToWrite dataUsingEncoding:NSUTF8StringEncoding]];
[fileHandle closeFile];
Run Code Online (Sandbox Code Playgroud)

请注意,这会将NSData附加到您的文件 - 而不是NSString.请注意,如果使用NSFileHandle,则必须确保该文件存在.fileHandleForWritingAtPath如果路径中没有文件,则返回nil.请参阅NSFileHandle类参考.

或者你可以这样做:

NSString *contents = [NSString stringWithContentsOfFile:filepath];
contents = [contents stringByAppendingString:textToWrite];
[contents writeToFile:filepath atomically:YES encoding: NSUnicodeStringEncoding error:&err];
Run Code Online (Sandbox Code Playgroud)

我相信第一种方法是最有效的,因为第二种方法涉及在将新内容写入文件之前将文件的内容读入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];
Run Code Online (Sandbox Code Playgroud)

请参阅stackoverflow上的问题


Cha*_*rts 31

最初我认为在接受的答案中使用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];
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 创建新文件时使用与附加到文件时不同的编码是否有任何原因? (2认同)