2009-07-01 62 views
0

我想將我的日誌字符串記錄到文件中。iPhone:記錄到文件

我採取了以下方法:

void QuietLog (NSString *format, ...) { 
    if (format == nil) { 
     printf("nil\n"); 
     return; 
    } 
    va_list argList; 
    va_start(argList, format); 

    NSMutableString *s = [[NSMutableString alloc] initWithFormat:format 
                 arguments:argList]; 
    [s replaceOccurrencesOfString: @"%%" 
         withString: @"%%%%" 
          options: 0 
          range: NSMakeRange(0, [s length])]; 

    #ifdef LOGTOFILE_MODE 
    NSData *dataToWrite = [s dataUsingEncoding: NSUTF8StringEncoding]; 
    [dataToWrite writeToFile: Log_FilePath atomically: YES]; 
    #else 
    printf("%s\n", [s UTF8String]); 
    #endif 

    [s release]; 
    va_end(argList); 
} 

的將writeToFile方法替換所有在一個文件中最後一個字符串之前的數據。但我想保留以前添加的數據並添加一個新的字符串。

writeToFile有什麼問題?它爲什麼會覆蓋所有現有的數據?如何添加新字符串而不是覆蓋舊字符串?

謝謝。

+0

更新我的回答是更有效的。論壇帖子我參考了你需要的所有信息。 – 2009-07-01 22:15:20

回答

7

如何使用NSFileHandle,即:

NSData *dataToWrite = [s dataUsingEncoding: NSUTF8StringEncoding]; 
NSFileHandle* outputFile = [NSFileHandle fileHandleForWritingAtPath:Log_FilePath]; 
[outputFile seekToEndOfFile]; 
[outputFile writeData:dataToWrite]; 
+0

我的應用程序不斷崩潰,因爲我寫的文件太大了。在循環中分配這種方式解決了這個問題,+1。 :) – JOG 2011-12-14 21:10:33

2

這個怎麼樣簡單的代碼(ref apple support forum):

@implementation NSData (NSDataExtensions) 

- (BOOL) appendToFile: (NSString *) path atomically: (BOOL) flag 
    { 
    NSFileHandle fh = [NSFileHandle fileHandleForWritingAtPath: path]; 

    if(fh) 
     @try 
     { 
     [fh seekToEndOfFile]; 
     [fh writeData: self]; 
     [fh closeFile]; 
     return YES; 
     } 
     @catch(id error) {} 

    return NO; 
    } 
@end 
+0

我認爲這很好,但不會很慢嗎?特別是當我有一個大文件? iPhone將首先讀取整個數據,然後附加新數據,然後再寫入整個數據。 – 2009-07-01 18:26:23