Перезаписать данные с помощью NSFileHandle
Используя NSFileHandle, довольно легко удалить n количество символов из конца файла с помощью truncateFileAtOffset.
-(void)removeCharacters:(int)numberOfCharacters fromEndOfFile:(NSFileHandle*)fileHandle {
unsigned long long fileLength = [fileHandle seekToEndOfFile];
[fileHandle truncateFileAtOffset:fileLength - numberOfCharacters];
}
Однако удаление символов из передней части файла не представляется возможным без необходимости копировать все оставшиеся данные в память, перезаписывать файл и затем записывать оставшиеся данные обратно в файл.
-(void)removeCharacters:(int)numberOfCharacters fromBeginningOfFile:(NSFileHandle*)fileHandle {
[fileHandle seekToFileOffset:numberOfCharacters];
NSData *remainingData = [fileHandle readDataToEndOfFile];
[fileHandle truncateFileAtOffset:0];
[fileHandle writeData:remainingData];
}
Этот код работает, но станет ответственностью с большими файлами. Что мне не хватает?
В идеале я хотел бы иметь возможность делать replaceCharactersInRange: withData:
Ответы
Ответ 1
После игры с NSFileHandle стало ясно, что вставка без перезаписи невозможна.
Как объясняется в: Вставка строки в заданную строку в текстовом файле с использованием объектива c ", вы можете увеличить только файл в конце, а не в средний."
Вот несколько более оптимизированная версия вышеприведенного кода:
-(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];
}
Я больше участвовал бы в том, чтобы замаскировать файл в другой файл в кусках. Это уменьшит проблемы памяти.