2015-02-20 15 views
11

Mit NSFileHandle können n Zeichen am Ende der Datei mithilfe von truncateFileAtOffset relativ einfach entfernt werden.Daten mit NSFileHandle überschreiben

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

jedoch entfernt Zeichen von der Vorderseite der Datei scheint nicht möglich, ohne alle übrigen Daten in den Speicher und überschreibt die Datei und dann schreiben die restlichen Daten zurück in die Datei kopieren zu müssen.

Dieser Code funktioniert, aber wird eine Haftung mit großen Dateien werden. Was vermisse ich?

Im Idealfall würde Ich mag Lage sein replaceCharactersInRange zu tun: withdata:

Antwort

8

Nach dem Spielen um mehr mit NSFileHandle wurde klar, dass die Einführung ohne Überschreibung unmöglich ist.

Wie erläutert in: Inserting a string at a specified line in text file using objective cSie nur eine Datei am Ende wachsen kann, nicht in der Mitte.“

Hier ist eine etwas optimierte Version des obigen Code:

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

I komplizierter Lösung wäre die Datei in eine andere Datei in Chunks zu puffern. Dies würde Speicherprobleme lindern.

+1

Dies ist eine nette Lösung. Ich würde vorschlagen, die Signatur der Methode zu aktualisieren: - (void) removeCharacters: (unsigned long long) numberOfCharacters fromBeginningOfFile: (NSFileHandle *) fileHandle { – LMVogel

Verwandte Themen