简体   繁体   中英

Overwrite Data using NSFileHandle

Using an NSFileHandle, it is pretty easy to remove n number of characters from the end of the file using truncateFileAtOffset.

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

However removing characters from the front of the file doesn't seem possible without having to copy all of the remaining data into memory, overwriting the file and then writing the remaining data back into the file.

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

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

This code works, but will become a liability with large files. What am I missing?

Ideally I'd like to be able to do replaceCharactersInRange:withData:

After playing around more with NSFileHandle it became clear that insertion without overwriting is impossible.

As explained in: Inserting a string at a specified line in text file using objective c " you can only grow a file at the end; not in the middle. "

Here is a slightly more optimized version of the above 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 more involved solution would be to buffer the file into another file in chunks. This would mitigate memory concerns.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM