我不喜欢我在这里写的东西。日志文件的全部内容被拉入内存,我想知道是否有办法追加到那里的任何东西,而不是把它拉出来。
NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
NSString *filePath = [documentsPath stringByAppendingPathComponent:@"Log"];
NSMutableString *content = [@"" mutableCopy];
NSMutableString *existing = [[NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil] mutableCopy];
[content appendString:existing];
[content appendString:@"\n"];
[content appendString:[user logDetails]];
[[content copy] writeToFile:filePath atomically:NO encoding:NSUTF8StringEncoding error:nil];
答案 0 :(得分:0)
该代码非常效率低下,但这是因为使用Foundation类时,文件操作通常很差。
我建议使用C-API函数fopen()
,fprintf()
等。只需从NSString
个对象写入UTF-8字符串,日志记录就会快得多,并且不会危及应用程序的内存占用。
答案 1 :(得分:0)
如果您想将自定义内容写入文件的末尾,那么请参阅@Amadan的注释。如果您想要一个正确的日志记录系统,包括日志轮换和异步日志记录以及各种其他事情,请查看https://github.com/CocoaLumberjack/CocoaLumberjack。与你一直梦想着自己投资相比,更多的爱已经消失了。
忽略@ trojanfoe的回答 - 如果你接受C API,你只需为自己做更多的工作,但收益微乎其微。
答案 2 :(得分:0)
我在FileSystem
课程中使用此内容:
+ (BOOL)appendData:(NSData *)_data toFile:(NSString *)_path
{
if( !_path || !_data )
return NO;
// TODO : check before for file existence
// open for binary append
FILE *_file = fopen([_path UTF8String], "ab");
if( !_file )
return NO;
size_t _nbObjToWrite = [_data length];
size_t _nbObjWritten = fwrite([_data bytes], 1, _nbObjToWrite, _file); // write [_data length] objectq of length 1 from [_data bytes] buffer in _file
if( _nbObjWritten != _nbObjToWrite ) {
fclose( _file );
return NO;
}
fclose( _file ); // will automatically flush the stream
return YES;
}
然后,您可以致电:
[MyClass appendData:[<myLogStringToAdd> dataUsingEncoding:NSUTF8StringEncoding] toFile:@"<pathToMyFile>"];