2009-07-01 6 views
0

Je souhaite enregistrer mes chaînes de journalisation dans un fichier.iPhone: connexion à un fichier

I mis en œuvre la méthode suivante:

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

La méthode writeToFile remplace toutes les données qui était dans un fichier avant avec la dernière chaîne. Mais j'aimerais conserver les données précédemment ajoutées et y ajouter une nouvelle chaîne.

Quel est le problème avec writeToFile? Pourquoi remplace-t-il toutes les données existantes? Comment puis-je ajouter de nouvelles chaînes au lieu d'écraser les anciennes?

Merci.

+0

mis à jour ma réponse pour être plus efficace. ce forum post je référence a toutes les informations dont vous avez besoin. –

Répondre

7

Comment l'utilisation NSFileHandle, ainsi:

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

Mon application a continué de se bloquer car j'écrivais des chaînes trop volumineuses dans un fichier. Portioning out de cette façon dans une boucle résolu que, +1. :) – JOG

2

Qu'en est-ce simple code (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

Je pense que ça va, mais ça ne marchera pas très lentement? Surtout quand j'ai un gros fichier? L'iPhone devra d'abord lire toutes les données, puis ajouter de nouvelles données et ensuite seulement pour écrire à nouveau toutes les données. –

Questions connexes