2015-02-20 15 views
11

Utilizzando un NSFileHandle, è abbastanza facile da rimuovere numero n di caratteri dalla fine del file usando truncateFileAtOffset.sovrascrivere i dati utilizzando NSFileHandle

-(void)removeCharacters:(int)numberOfCharacters fromEndOfFile:(NSFileHandle*)fileHandle { 
    unsigned long long fileLength = [fileHandle seekToEndOfFile]; 
    [fileHandle truncateFileAtOffset:fileLength - numberOfCharacters]; 
} 

Tuttavia rimuovendo i caratteri dalla parte anteriore del file non sembra possibile, senza dover copiare tutti i dati rimanenti nella memoria, sovrascrivendo il file e quindi scrivere i dati rimanenti all'interno del file.

-(void)removeCharacters:(int)numberOfCharacters fromBeginningOfFile:(NSFileHandle*)fileHandle { 
    [fileHandle seekToFileOffset:numberOfCharacters]; 

    NSData *remainingData = [fileHandle readDataToEndOfFile]; 
    [fileHandle truncateFileAtOffset:0]; 
    [fileHandle writeData:remainingData]; 
} 

Questo codice funziona, ma diventerà una responsabilità in file di grandi dimensioni. Cosa mi manca?

Idealmente mi piacerebbe essere in grado di fare replaceCharactersInRange: Withdata:

risposta

8

Dopo aver suonato in giro per di più con NSFileHandle è apparso chiaro che l'inserimento senza sovrascrivere è impossibile.

Come spiegato in: Inserting a string at a specified line in text file using objective c "si può crescere solamente un file alla fine; non nel mezzo."

Ecco una versione leggermente più ottimizzata del codice di cui sopra:

-(void)removeCharacters:(unsigned long long)numberOfCharacters fromBeginningOfFile:(NSFileHandle*)fileHandle { 
    [fileHandle seekToFileOffset:numberOfCharacters]; 

    NSData *remainingData = [fileHandle readDataToEndOfFile]; 
    [fileHandle seekToFileOffset:0]; 
    [fileHandle writeData:remainingData]; 
    [fileHandle truncateFileAtOffset:remainingData.length]; 
} 

La soluzione più coinvolta sarebbe quella di bufferizzare il file in un altro file in blocchi. Ciò attenuerebbe i problemi di memoria.

+1

Questa è una bella soluzione. Suggerirei di aggiornare la firma del metodo in modo che: - (void) removeCharacters: (unsigned long long) numberOfCharacters fromBeginningOfFile: (NSFileHandle *) fileHandle { – LMVogel

Problemi correlati