2012-06-19 6 views
26

Ho un file di registro che sto cercando di aggiungere dati alla fine di. Ho una variabile NSMutableStringtextToWrite, e sto facendo il seguente:Aggiunta alla fine di un file con NSMutableString

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

Tuttavia, quando faccio questo tutto il testo all'interno del file viene sostituito con il testo in textToWrite. Come posso invece aggiungere alla fine del file? (O ancora meglio, come posso aggiungere alla fine del file in una nuova riga?)

+0

credo che 'NSLog' non funziona nel modo desiderato? – zneak

+0

FYI, non esiste alcun metodo su 'NSString' /' NSMutableString' che ti consenta di aggiungerlo a un file. C'è un esempio [qui] (http://lists.apple.com/archives/cocoa-dev/2002/Aug/msg00754.html) però. – zneak

risposta

48

Credo che si potrebbe fare un paio di cose:

NSFileHandle *fileHandle = [NSFileHandle fileHandleForWritingAtPath:aPath]; 
[fileHandle seekToEndOfFile]; 
[fileHandle writeData:[textToWrite dataUsingEncoding:NSUTF8StringEncoding]]; 
[fileHandle closeFile]; 

Si noti che questo aggiungerà NSData al vostro file - NON una NSString. Nota che se usi NSFileHandle, devi assicurarti che il file esista prima della mano. fileHandleForWritingAtPath restituirà nulla se nessun file esiste nel percorso. Vedi lo NSFileHandle class reference.

Oppure si potrebbe fare:

NSString *contents = [NSString stringWithContentsOfFile:filepath]; 
contents = [contents stringByAppendingString:textToWrite]; 
[contents writeToFile:filepath atomically:YES encoding: NSUnicodeStringEncoding error:&err]; 

Credo che il primo approccio sarebbe la più efficace, dal momento che il secondo approccio implica la lettura del contenuto del file in un NSString prima di scrivere il nuovo contenuto al file. Ma, se non vuoi che il tuo file contenga NSData e preferisci mantenerlo, la seconda opzione sarà più adatta a te.

[Update] Dal stringWithContentsOfFile è deprecated è possibile modificare secondo approccio:

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

See question on stackoverflow

+0

Così ho fatto il tuo primo suggerimento e, mentre funziona, ho questo errore davvero strano che tutto ciò che appendo si presenta come un personaggio cinese! (anche se tutti i dati che sto scrivendo sul file sono in inglese, e prima, quando stava sostituendo il testo, si presentava come inglese) –

+0

Ho modificato la mia risposta ... si sta aggiungendo NSData al tuo file, non chiaro testo. Se vuoi mantenere il tuo file come testo normale dovresti usare il secondo metodo. –

23

Inizialmente ho pensato che con il metodo FileHandler nella risposta accettato che stavo per ottenere un mucchio di valori di dati esadecimali scritti nel mio file, ma ho un testo leggibile che è tutto ciò di cui ho bisogno. Quindi in base al largo la risposta accettata, questo è ciò che mi si avvicinò con:

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

In questo modo se il file non esiste ancora, lo si crea. Se esiste già, si aggiunge solo ad esso. Inoltre, se si entra nel plist e si aggiunge una chiave sotto l'elenco delle proprietà delle informazioni UIFileSharingEnabled e si imposta il valore su true, l'utente può eseguire la sincronizzazione con il proprio computer e visualizzare il file di registro tramite iTunes.

+0

C'è qualche ragione per cui quando si crea un nuovo file si sta utilizzando una codifica diversa rispetto a quando si aggiunge al file? – huggie

+0

No, non me ne sono nemmeno accorto. –

+1

Il modo più semplice per costruire quel percorso è usare '[documentsDirectory stringByAppendingPathComponent: @" hydraLog.txt "]' –

1

Ed ecco un (leggermente adottata) versione Swift di Chase Roberts' solution:

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